java多维多类型数组(map/list/collection)?

iecba09b  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(271)

我们有这样的声明: ArrayList<Map<String, Map<Integer, Object>>> parameterSet = new ArrayList<Map<String, Map<Integer, Object>>>(); 也许可以这样定义它(我知道,这是错误的,请把它当作伪代码): List<List<String, Integer, Object>> parameterSet = new ...; 我敢肯定,有一个更好的方法来定义这样一个二维多类型的“数组”。

eqoofvh9

eqoofvh91#

这里的问题不是维度,而是“多类型”。
要么你为你的元素找到一个通用的超类型(最后的手段总是可以的) Object )或者创建一个 Package 器类,它可以容纳您需要的任何类型。

List<Object>

Object 对象是快速且“简单”的,但是当您需要将元素强制转换为它们的实际类时,它可能会变得混乱。根据您希望在列表中保留的不同类型的数量,ifs可能会变得非常复杂:

Object elem = mylist.get(i);
if(elem instanceof Float){
   Float floatElem = (Float) elem;
}
...

更精确的是 Package 器类

public class Wrapper<T>  {
     private T data;

     // constructors can be nice
     public Wrapper(Float f){this.data=f;}
     public Wrapper(Double d){this.data=d;}
     public Wrapper(String s){this.data=s;}

     public void setData(T newData) {
         data = newData;
     }

     public T getData() {
         return data;
     }

     // you can add convenience methods to find out what type your wrapper holds
     public boolean isString(){
         return this.data instanceof String;  // for example
     }

     // and also convenience methods to "cast" your data 
     public Float asFloat(){
        return (Float) this.data;
     }
}

那么您的列表将只需要保存 Package 器类

List<Wrapper> list = new ArrayList<>();
list.add(new Wrapper<Float>(1.2f));

要检查元素的类型,可以使用方便的方法:

if(list.get(i).isFloat()){
  Float f = list.get(i).asFloat();
}
bvjveswy

bvjveswy2#

使用标准java集合api,您基本上可以做两件事:
使用 List 而不是 ArrayList 在声明中: List<Map<String, Map<Integer, Object>>> parameterSet = new ArrayList<Map<String, Map<Integer, Object>>>(); 使用菱形运算符(如果您使用的是java 7+): List<Map<String, Map<Integer, Object>>> parameterSet = new ArrayList<>(); 不过,在本例中,我会考虑定义一个类来封装复杂的数据结构(map of map)。

相关问题