如何嵌套列表转换成多维数组? [英] How to convert nested List into multidimensional array?

查看:116
本文介绍了如何嵌套列表转换成多维数组?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在Java的我想转换一个嵌套的列表这在最深层次包含了一个统一的类型到该类型的多维数组。例如,的ArrayList< ArrayList的< ArrayList的< ArrayList的<弦乐>>>> 的String [] [] [] [] 。我试过几件事情,我只能获得对象的数组,如对象[] [] [] [] 。对于简单列表似乎阿帕奇共享郎做的工作,但我想不出嵌套的情况。

更新:

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

  //这个函数的参数是一个(嵌套)名单
公共静态对象转换(Object对象){    [对象]结果= NULL;
    列表列表=(列表)对象;
    如果(名单!= NULL){        对象类型= getElementType(名单);
        如果(键入的instanceof名单){            INT大小=则为list.size();
            结果=新对象[大小]
            对于(INT计数器= 0;反<大小;反++){                Object元素= list.get(柜);
                结果[窗口] =(元素!= NULL)?转换(元):空;
            }
        }其他{
            结果= list.toArray();
        }
    }    返回结果;
}私有静态对象getElementType(名单列表){    对象result = NULL;
    对于(Object元素:名单){
        如果(元素!= NULL){            结果=元素;
            打破;
        }
    }    返回结果;
}


解决方案

这是有人建议解决的字符串方式键入。 硬脂酸钙(列表<>)返回多维数组。它可以被推广到使用类类型作为参数。谢谢您的意见。

 静态INT DIMENSION2(Object对象){    INT结果为0;
    如果(对象的instanceof名单<>){        结果++;
        清单<>名单=(列表<>)对象;
        对于(Object元素:名单){
            如果(元素!= NULL){
                结果+ = DIMENSION2(元);
                打破;
            }
        }
    }    返回结果;
}
静态对象硬脂酸钙(列表<> L){    INT昏暗= DIMENSION2(L);
    如果(昏暗== 1){
        返回l.toArray(新的String [0]);
    }    INT []变暗=新INT [DIMENSION2(L)];
    变暗[0] = l.size();
    对象A = Array.newInstance(为String.class,变暗);
    的for(int i = 0; I< l.size();我++){        清单<> E =(列表<>)l.get(I)
        如果(E == NULL){
            Array.set(A,I,NULL);
        }否则如果(DIMENSION2(E)→1){
            Array.set(A,I,硬脂酸钙(e)条);
        }其他{
            Array.set(A,I,e.toArray(新的String [0]));
        }
    }
    返回;
}

In Java I want to convert a nested List which contains at the deepest level a uniform type into an multidimensional array of that type. For example, ArrayList<ArrayList<ArrayList<ArrayList<String>>>> into String[][][][]. I've tried several things and I only can obtain an array of objects like Object[][][][]. For 'simple lists' it seems that Apache Commons Lang does the work but I cannot figure out for nested cases.

Update:

In order to obtain a multidimensional array of Object type I'm using a recursive function so I cannot set the key type using toArray() see excerpt:

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

解决方案

This is the way that someone suggested to solved for String type. Cast2(List<?>) returns the multidimensional array. It may be generalized to use the class type as parameter. Thank you for your comments.

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

这篇关于如何嵌套列表转换成多维数组?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆