1

String 型の要素が String 型の LinkedList に出現する回数をカウントできるメソッドを作成しています。以下に示す私のコードは機能しません。以下でコメントした行の範囲外のインデックスを取得し続けます。バグが見つからないようです

public int findDuplicate (LinkedList<String> e) {
    int j = 1;
    LinkedList<String> test = e;
    while (!test.isEmpty()){
        test = e;
        String value = test.pop();
        //Screws up here when i = 6 
        for(int i =0; i<=test.size() && test.get(i)!=null; i++){ 
            String value3 = test.get(i);
            if(e.get(i).equals(value) && i<=test.size()){
                String value2 = test.get(i); 
                j++;
                String Duplicate = e.get(i);
                e.remove(i);
            }
        }
        System.out.println(value + " is listed " + j + " times");

    }
    return j;
}

ハッシュマップの使用.. まだ機能しない public void findDuplicate (LinkedList e) {

        Map<String,Integer> counts = new HashMap<String,Integer>();

        while(!e.isEmpty()){
            String value = e.pop();
            for(int i =0; i<e.size(); i++){
                counts.put(value, i);
            }
        }
        System.out.println(counts.toString());
}
4

2 に答える 2

5

test使用方法から明らかでありe、それらが 2 つの別個の独立したオブジェクトであることを期待していることは明らかです。実際、そうではありません。次の割り当てを実行する場合:

    test = e;

両方ともtest同じeリストを指すことになります。どちらかを変えると、両方が変わります。

この問題を解決する良い方法として、 a を使用して、Map<String,Integer>各一意の文字列がリストに表示される回数を数えることができます。次に、リストを 1 回だけ反復処理して、マップにデータを入力します。最後に、マップは最終的なカウントを示します。

于 2013-03-04T07:34:27.507 に答える
2

インデックスは 0 ~test.size()-1です。使用してみてください:

for(int i =0; i<test.size() && test.get(i)!=null; i++){ 
...

そして、@NPE が指摘したように、同じオブジェクトeを共有しているため、このコードは正しく機能しません。test

于 2013-03-04T07:34:37.170 に答える