2011-12-30 29 views
0

我將字符串[]添加到Arraylist,但是當我嘗試從它檢索值時,發生了一些錯誤。和ArrayList的先前值與新的項得到更新(字符串[]) 預期輸出:
第一,仲
1,2
一個,兩個我有ArrayList包含字符串[],如果我添加新的字符串[]到列表中,它也修改了以前添加的字符串[]對象

電流輸出:
一個,兩個
之一,兩個 一,兩個

下面是代碼。

ArrayList<String[]> list = new ArrayList<String[]>(); 
    String[] temp ={"First","Sec"}; 
    list.add(temp); 
    temp[0] ="1";temp[1]="2"; 
    list.add(temp); 
    temp[0] ="one";temp[1]="two"; 
    list.add(temp); 

    printLog(list); 

這裏是打印方法

private void printLog(ArrayList<String[]> result) { 
    for (int i = 0; i < result.size(); i++) { 
     Log.d(TAG,"I="+i); 
     String[] temp = result.get(i); 
     Log.d(TAG,temp[0]+","+temp[1]+"\n"); 
    } 

} 

任何suggessions。

回答

6

您正在將數組對象的引用添加到列表中。你需要每次創建新的數組。

String[] temp ={"First","Sec"}; 
    list.add(temp); 
    temp=new String[2]; 
    temp[0] ="1";temp[1]="2"; 
    list.add(temp); 
+0

感謝它的作品被視爲新的數組。 – AAnkit 2011-12-30 07:07:57

0

它看起來像你通過引用傳遞數組(而不是ArrayList)。這意味着,當你有多種方式來訪問數據,都指向同一個位置的RAM,這意味着變化看似傳播。

要解決這個問題,我建議要麼創建一個new String[]或使用Arrays.copyOf(...)方法。

1

在將第二個添加到列表之前,您需要分配一個新的String []數組值。現在你正在覆蓋數組中的值,這就是爲什麼只有最後一個出現。

+0

當我試圖進入1,2(第二加在我的代碼),爲什麼首先,秒得到更新,因爲它已經在ArrayList中 – AAnkit 2011-12-30 07:05:39

+0

保存你的ArrayList是保存一個指向臨時在所有3項。所以他們都指向同一個對象。這就是爲什麼你每次都需要創建一個新對象。 – 2011-12-30 07:06:42

0

這個問題是beeing問相當頻繁。 ArrayList不會創建添加到其中的對象的副本。它只是存儲對這些對象的引用。所以,如果你加入,你在做什麼,在同一陣列的兩倍,只需在列表中擁有兩個引用同一個數組。

您必須爲列表的每個元素創建一個新的數組。

0

我在向HashMap添加列表時遇到了同樣的問題。實際上,當你在同一個函數中工作時,它會添加對該列表/數組的引用。所以你需要每次更改String []名稱;以添加到列表中。

0

It seems that Atring array is initialized once but its value is overridden three times.最初的String []臨時包含{"First","Sec"};然後它通過寫temp[0] ="1"; temp[1]="2";成爲{"1","2"}最後它通過每次在同一陣列的值是變化寫入temp[0] ="one"; temp[1]="two";

在這種情況下成爲{"one", "two"}需要初始化(by writing temp = new String[2];)陣列每次,以便它不會在同一

String[] temp ={"First","Sec"}; 
       list.add(temp); 
       temp = new String[2]; 
       temp[0] ="1"; 
       temp[1]="2"; 
       list.add(temp); 
       temp = new String[2]; 
       temp[0] ="one"; 
       temp[1]="two"; 
       list.add(temp);