按值发送2D Arraylist

时间:2014-06-15 13:44:43

标签: java arraylist

我试图按值发送2D Arraylist 所以我写了下面的代码

    public static void main(String[] args) {
        ArrayList<List<Object>> a = new ArrayList<List<Object>>();

        for (int i = 0; i < 10; i++) {
            List in_a =  Arrays.asList("aa","bb","cc","dd");
            a.add(in_a);
        }

// THE FOLLOWING WOULD WORK IN A 1D ARRAY, BUT NOT 2D
//        ArrayList<List<Object>>  b = new ArrayList < List<Object> > (a);

// THIS IS MY WORKING SOLUTION
        ArrayList < List<Object> > b = new ArrayList < List<Object> >() ;
        for (int i = 0; i < a.size(); i++) {
            List in_b =  new ArrayList(a.get(i));
            b.add(in_b);
        }

        b.get(1).set( 3, "33");

        System.out.println("a.get(1).get(3) = " + a.get(1).get(3));
        System.out.println("b.get(1).get(3) = " + b.get(1).get(3));
    }

但我不喜欢这个解决方案

有没有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:0)

由于列表只能包含Objects或扩展Object(所有这些)的类,因此您只会将引用强制复制到新列表中。因此,如果您想要“2D-List”的1:1副本,则需要循环“第一维”并复制“第二维”:

ArrayList<List<Object>> c = new ArrayList<>();
for(List in_a : a){
    c.add(new ArrayList<>(in_a));
}

这只是你在循环中所做的简短版本。因此,我们创建了一个新的ArrayList c,并用a中的每个子列表的副本填充它。 但要注意,我在这里使用增强循环(没有索引),因此无法保证ca的顺序相同(尽管坦率地说,你应该没问题)

答案 1 :(得分:0)

您可以尝试使用clone()方法:

ArrayList <List<Object>> originalList = new ArrayList <List<Object>>();
// ...
ArrayList <List<Object>> list2D = new ArrayList <List<Object>>();
for (List<Object> list : originalList) {
    list2D.add(list.clone());
}