2013-10-02 128 views
2

我想寫一個Java中的程序,將計算一個整數數組(包含5個元素)中的元素的所有組合,並將這些組合輸出到一個ArrayList。我已經在下面包含了我的代碼。Java:麻煩添加項目ArrayList <ArrayList <Integer>>

我使用按位運算來查找組合。每個組合都被構造爲一個ArrayList(Integer),稱爲「writeitem」。然後我想將這些存儲在另一個ArrayList中,稱爲「master」,它必須具有ArrayList(ArrayList(Integer))的形式。 [格式化原因<>必須用()替換;他們不顯示,否則...]

嘗試將每個組合保存到「主」ArrayList時出現問題。如果您運行下面的代碼,printf函數將顯示組合構建正確。但是,一旦我要求它被「添加」到「主」,它似乎不會被追加到「主」的末尾。相反,所有「主人」都被剛剛構建的組合的副本覆蓋。因此,例如,如果我在[1,2,3,4,5]上調用函數,那麼我的「主」數組最終會成爲[副本1,2,3,4,5]的31個副本(其中,第31組合被發現)。

我想這與使用嵌套數組列表有關,還有更好的方法來實現我想要的。但是我也犯了一些其他的新手錯誤。清楚了()method.from爲loop.after每次迭代明確()從ArrayList中移除 值

static ArrayList<ArrayList<Integer>> master = new ArrayList<ArrayList<Integer>>(); 
public static void generatecombs(int[] x){ 

    ArrayList<Integer> writeitem = new ArrayList<Integer>(); //empty list to construct each comb 

    for(int i=1;i<32;i++){ 

     writeitem.clear(); //clear before constructing next combination 

     if((i & 1)>0){   //check if each element is present in combination 
      writeitem.add(x[0]); 
     } 
     if((i & 2)>0){ 
      writeitem.add(x[1]); 
     } 
     if((i & 4)>0){ 
      writeitem.add(x[2]); 
     } 
     if((i & 8)>0){ 
      writeitem.add(x[3]); 
     } 
     if((i & 16)>0){ 
      writeitem.add(x[4]); 
     } 

     System.out.printf("The %dth combination is %s\n", i,writeitem); 
     master.add(writeitem); //output constructed element 
     System.out.printf("The collection so far is: %s\n", master); 
    } 
} 

回答

1

移動循環

static ArrayList<ArrayList<Integer>> master = new ArrayList<ArrayList<Integer>>(); 

public static void generatecombs(int[] x){ 

    for(int i=1;i<32;i++){ 

     ArrayList<Integer> writeitem = new ArrayList<Integer>(); // new list to construct each comb 
     if((i & 1)>0){   //check if each element is present in combination 
      writeitem.add(x[0]); 
     } 
     if((i & 2)>0){ 
      writeitem.add(x[1]); 
     } 
     if((i & 4)>0){ 
      writeitem.add(x[2]); 
     } 
     if((i & 8)>0){ 
      writeitem.add(x[3]); 
     } 
     if((i & 16)>0){ 
      writeitem.add(x[4]); 
     } 

     System.out.printf("The %dth combination is %s\n", i,writeitem); 
     master.add(writeitem); //output constructed element 
     System.out.printf("The collection so far is: %s\n", master); 
    } 
} 
+0

謝謝!並感謝大家的答案,現在它可以工作,並且我明白我做錯了什麼。 – lexipenia

0

刪除把你的ArrayList創建裏面的。

+0

沒有,清晰是必須的。在循環內用新的替換清除。 – Aubin

0

內的新舉措的writeitem建設中的for循環。你不想重新使用相同的數組。

0

另一種解決方案是在清除writeItem之前添加到父列表時進行克隆。

master.add(writeitem.clone()); 
+0

否,克隆返回此LinkedList的淺表副本。 – Aubin

0

你得到31份的原因是因爲你通過for循環運行,擦writeitem陣列每次清洗,加入到它,並打印出來,同時仍然在for循環,這然後重複30次以上,直到我打32

刪除writeitem.clear();,看你怎麼得到與

+0

不,下一個循環繼續添加到先前分配的列表中... – Aubin

+0

謝謝。這澄清了我的錯誤。我沒有意識到,一旦「writeitem」輸出到「master」,它仍然被稱爲「writeitem」WITHIN「master」,並且每次都進行修改。 – lexipenia

相關問題