2013-03-05 138 views
1

我想按字母排序字符串的ArrayList,每個「存儲區」存儲以相同字母開頭的單詞。用於將單詞存儲在ArrayList中的存儲桶

這是我到目前爲止。

public static ArrayList<ArrayList> bucketMaker(ArrayList<String> list) { 
    ArrayList<ArrayList> output = new ArrayList<ArrayList>(26); 
    ArrayList<String> bucket = new ArrayList<String>(); 
    for (String s : list) { 
     for (char letter = 'a'; letter <= 'z'; letter++) { 
      if (s.startsWith(String.valueOf(letter))) { 
       bucket.add(s); 
       output.add(bucket); 
       bucket.clear(); 
      } 
     } 
    } 
    return output; 
} 

我有水桶被區分,如果我有bucket.clear();它簡單地清除整個列表的問題。我該如何做到這一點,讓這個詞保持鬥勁,我知道ArrayList存儲對一個對象的引用,我不知道如何使它停留在列表中,而不會使其停留在列表中。如果我遺漏了bucket.clear();,那麼我在每個「桶」中都有相同的對象。

編輯

我現在有

public static ArrayList<ArrayList> bucketMaker(ArrayList<String> list) { 
    ArrayList<ArrayList> output = new ArrayList<ArrayList>(26); 
    ArrayList<String> bucket = new ArrayList<String>(); 

    for (char letter = 'a'; letter <= 'z'; letter++) { 
     output.add(new ArrayList<String>()); 
    } 

    for (String s : list) { 
     for (char letter = 'a'; letter <= 'z'; letter++) { 
      if (s.startsWith(String.valueOf(letter))) { 
       output.get(letter-97).add(s); 
      } 
     } 
    } 
    return output; 
} 

其工作,感謝您的幫助!

+1

你需要26個桶,但你有一個。你持續沖洗。 :( – Nishant 2013-03-05 02:20:02

回答

3

我想你想要的是

ArrayList<ArrayList> output = new ArrayList<ArrayList<String>>(); 

//Add 26 buckets 
for (char letter = 'a'; letter <= 'z'; letter++) { 
    output.add(new ArrayList<String>()); 
} 

//add each string to the correct bucket 
for (String s : list) { 
    for (char letter = 'a'; letter <= 'z'; letter++) { 
     if (s.startsWith(String.valueOf(letter))) { 

      output.get(letter).add(s); 
      // Get the bucket add the string 
     } 
    } 
} 

記住ArrayList構造函數不創建26個元素,只是分配它的空間,至少至於你擔心。

+0

@MrGreenAcid注意,這個解決方案創建了26個ArrayLists,你似乎想要避免它。KarthikT通過將所有這些ArrayList保存在另一個ArrayList中來智能地完成這個操作。這樣,只有一個變量,而不是26,循環來創建列表。 – 2013-03-05 02:41:20