如何将嵌套List转换为多维数组?

时间:2009-12-17 15:30:39

标签: java arrays nested multidimensional-array arraylist

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

更新

为了获得Object类型的多维数组,我使用递归函数,所以我不能使用toArray()设置密钥类型,参见摘录:

{{1}}

4 个答案:

答案 0 :(得分:3)

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

看起来你已经对Object数组的创建进行了排序,所以使用它并使用了类型键,我认为你们都已经排序了! : - )

答案 1 :(得分:1)

这是某人建议解决String类型的方式。 Cast2(List<?>)返回多维数组。可以推广使用类类型作为参数。感谢您的评论。

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

答案 2 :(得分:0)

嘿嘿,这也是一个答案,但如果真的有帮助,我不知道:

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

看起来很乱,但我很喜欢反思:)

答案 3 :(得分:0)

您可以使用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);