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ストアがオブジェクトを参照していることを理解していますが、 26 を作成せずにそれをリストに残す方法がわかりません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;
}

助けてくれてありがとう!

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 に答える