1

我想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存储对对象的引用,并且我不知道如何使其保留在列表中而不使 26ArrayList的。如果我遗漏了,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;
}

哪个有效,感谢您的帮助!

4

1 回答 1

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 个元素,只是为其分配空间,至少就您而言。

于 2013-03-05T02:18:52.943 回答