【问题标题】:How to convert nested List into multidimensional array?如何将嵌套列表转换为多维数组?
【发布时间】:2010-12-27 17:01:51
【问题描述】:

在 Java 中,我想将嵌套的 List 转换为该类型的多维数组,它在最深层包含一个统一类型。例如,ArrayList<ArrayList<ArrayList<ArrayList<String>>>> 变为 String[][][][]。我已经尝试了几件事,但我只能获得像Object[][][][] 这样的对象数组。对于“简单列表”,Apache Commons Lang 似乎完成了这项工作,但我无法弄清楚嵌套案例。

更新:

为了获得 Object 类型的多维数组,我使用递归函数,因此我无法使用 toArray() 设置键类型,请参阅摘录:

// the argument of this function is a (nested) list
public static Object convert(Object object) {

    Object[] result = null;
    List list = (List) object;
    if (list != null) {

        Object type = getElementType(list);
        if (type instanceof List) {

            int size = list.size();
            result = new Object[size];
            for (int counter = 0; counter < size; counter++) {

                Object element = list.get(counter);
                result[counter] = (element != null) ? convert(element) : null;
            }
        } else {
            result = list.toArray();
        }
    }

    return result;
}

private static Object getElementType(List list) {

    Object result = null;
    for (Object element : list) {
        if (element != null) {

            result = element;
            break;
        }
    }

    return result;
}

【问题讨论】:

  • 您的输入和您想要的输出都不够清晰。请分享更多关于你已经尝试过的细节。
  • @seh:OP 想要的是能够从List&lt;List&lt;List&lt;List&lt;T&gt;&gt;&gt;&gt; 创建一个T[][][][](例如),用于任何引用类型T。相反,他收到的是Object[][][][]
  • 我被这句话迷住了进入原始类型的数组列表。显然,这实际上意味着“进入原始类型的多维数组”。
  • 感谢 Chris 重新表述我的问题,我已经使用 seh 的注释对其进行了编辑。
  • String 是从什么时候开始的?从什么时候开始可以将原语存储在 Collection 中?

标签: java arrays nested multidimensional-array arraylist


【解决方案1】:

你可以使用transmorph

ArrayList<ArrayList<ArrayList<ArrayList<String>>>> arrayList = new ArrayList<ArrayList<ArrayList<ArrayList<String>>>>();

/// populate the list ...
[...]    

Transmorph transmorph = new Transmorph(new DefaultConverters());
String[][][][] array = transmorph.convert(arrayList, String[][][][].class);

【讨论】:

    【解决方案2】:

    这是有人建议解决String 类型的方式。 Cast2(List&lt;?&gt;) 返回多维数组。可以泛化为使用类类型作为参数。谢谢你们的cmets。

    static int dimension2(Object object) {
    
        int result = 0;
        if (object instanceof List<?>) {
    
            result++;
            List<?> list = (List<?>) object;
            for (Object element : list) {
                if (element != null) {
                    result += dimension2(element);
                    break;
                }
            }
        }
    
        return result;
    }
    
    
    static Object cast2(List<?> l) {
    
        int dim = dimension2(l);
        if (dim == 1) {
            return l.toArray(new String[0]);
        }
    
        int[] dims = new int[dimension2(l)];
        dims[0] = l.size();
        Object a = Array.newInstance(String.class, dims);
        for (int i = 0; i < l.size(); i++) {
    
            List<?> e = (List<?>) l.get(i);
            if (e == null) {
                Array.set(a, i, null);
            } else if (dimension2(e) > 1) {
                Array.set(a, i, cast2(e));
            } else {
                Array.set(a, i, e.toArray(new String[0]));
            }
        }
        return a;
    }
    

    【讨论】:

      【解决方案3】:

      呵呵,这也是一个答案,但我不知道这是否真的有帮助:

      List<ArrayList<ArrayList<ArrayList<String>>>> x = new ArrayList<ArrayList<ArrayList<ArrayList<String>>>>();
      
          public static void main(String[] args) throws MalformedURLException, IOException, SecurityException, NoSuchFieldException {
      
              Type t = ((ParameterizedType)(jdomTEst.class.getDeclaredField("x").getGenericType())).getActualTypeArguments()[0];  
              int[] dims = new int[t.toString().split("List").length];
              Object finalArray = Array.newInstance(String.class,  dims);
      
              System.out.println(finalArray);
      
          }
      

      这打印:[[[[Ljava.lang.String;@4e82701e

      看起来很乱,但我喜欢倒影:)

      【讨论】:

      • 创建不是问题,考虑我创建并填充了嵌套列表,现在我想将其转换为多维数组,保留原始列表的填充值。
      【解决方案4】:

      要创建任何类型的非Object 数组,您需要将类型键 传递给toArray 方法。这是因为对于泛型类型(例如,ArrayList),类型参数被擦除(因此,在运行时,ArrayList&lt;String&gt; 被视为普通的ArrayList),而对于数组,类型不是。

      看来您已经对 Object 数组创建进行了排序,所以有了它和使用 type 键,我想你们都已经排序了! :-)

      【讨论】:

      • 例如,new ArrayList&lt;String&gt;().toArray() 返回一个Object[]。传入类型键,如new ArrayList&lt;String&gt;().toArray(new String[0]),表示返回值为String[]。您只需要弄清楚如何在生成Object[][][][] 的当前代码中使用此概念。
      • 我无法设置类型键,因为我使用递归函数生成嵌套列表,然后将其转换为对象的多维数组
      猜你喜欢
      • 2022-01-09
      • 2016-09-28
      • 2014-12-30
      • 2018-02-10
      • 2012-11-24
      • 1970-01-01
      • 2013-05-17
      • 2020-01-24
      • 1970-01-01
      相关资源
      最近更新 更多