2013-03-05 139 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