2014-06-15 48 views
0

我米试图通过价值 发送一个二维的ArrayList所以我写了下面的代码发送二维的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)); 
    } 

不过,我不喜欢这样的解决方案

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

+0

您是否需要浅层或深层复制以及在什么层次?你知道如果一个[i] [j]是可变的,即使你的工作解决方案b [i] [j]仍然是对[i] [j]的引用,所以如果修改[i] [j] ,b [i] [j]会反映修改吗? –

回答

0

由于列表只能包含Objects或扩展为Object(所有这些类)的类,因此只会将引用强制复制到新列表中。所以,如果你想有一个1:一个“2D-清单”复印件1份,则需要通过“第一维”循环,并复制“第二维”:

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

这只是一个较短的版本是什么你已经在你的循环中做了。因此,我们创建一个新的ArrayList c并填写a的每个子列表的副本。 但要注意,这里我使用增强环路(无指标),所以不能保证c是相同的顺序a(但坦率地说,你应该罚款)

0

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

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