【问题标题】:Java multidimensional multi type Array (Map/List/Collection)?Java多维多类型数组(Map/List/Collection)?
【发布时间】:2020-08-19 07:32:36
【问题描述】:

我们有这样的声明:

ArrayList<Map<String, Map<Integer, Object>>> parameterSet = new ArrayList<Map<String, Map<Integer, Object>>>();

大概可以这样定义(我知道,错了,请当成伪代码):

List<List<String, Integer, Object>> parameterSet = new ...;

我很确定,有更好的方法来定义这样一个二维多类型“数组”。

【问题讨论】:

    标签: java list multidimensional-array


    【解决方案1】:

    这里的问题不是维度而是“多类型”。

    要么为你的元素找到一个通用的超类型(最后的手段总是Object),要么你创建一个可以容纳你需要的任何类型的包装类。

    List<Object> 
    

    拥有Object 对象既快速又“简单”,但是当您需要将元素转换为它们的实际类时,它会变得混乱。根据您希望在列表中包含多少不同类型,if 可能会变得非常复杂:

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

    更精确的是包装类

    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;
         }
    }
    

    那么你的 List 只需要保存你的包装类

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

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

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

    【讨论】:

    • 谢谢,看起来不错,但也很“复杂”。我希望有一个单线解决方案。尽管如此,我们似乎必须走这条路。
    • 你说得对,它远非单行。但至少你可以把“复杂”的东西放在一个地方。
    【解决方案2】:

    使用标准的 Java Collection API,您基本上可以做两件事:

    1. 在声明中使用List 而不是ArrayListList&lt;Map&lt;String, Map&lt;Integer, Object&gt;&gt;&gt; parameterSet = new ArrayList&lt;Map&lt;String, Map&lt;Integer, Object&gt;&gt;&gt;();
    2. 使用菱形运算符(如果您使用 Java 7+):List&lt;Map&lt;String, Map&lt;Integer, Object&gt;&gt;&gt; parameterSet = new ArrayList&lt;&gt;();

    不过,在这种情况下,我会考虑定义一个封装复杂数据结构(map of map)的类。

    【讨论】:

    • 嗯,这不是真正的问题..还是我没有以正确的方式理解您的答案?我正在寻找没有第二个“地图”的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 2018-08-02
    相关资源
    最近更新 更多