0

ArrayList 内の要素の重複を再帰的に削除するメソッドに取り組んでいます。しかし、私は少し問題に直面しています.私の方法は機能し、いくつかの要素を削除しますが、すべての重複を削除するわけではありません.

これが私の入力です:

100, 200, 200, 300, 400, 300, 100, 500, 500, 400, 100, 400, 100, 100

出力は次のとおりです。

100, 200, 300, 400, 100, 500, 100

そして私の方法:

public static void removeDuplicates(ArrayList<Integer> list, int counter){
    if(list == null){
        throw new NullPointerException();
    }

    if(counter < list.size()){
        if(list.contains(list.get(counter))){
            list.remove(list.lastIndexOf(list.get(counter)));
        }
        removeDuplicates(list, ++counter);
    }
}

上記の値の最後の要素のみを削除してから、次の要素に反復していることを理解しています。重複しているすべての要素を削除するには、これをどのように変更する必要があるのか​​ 疑問に思っていました。また、私を混乱させる私の出力の一部は、「400」の値が 3 つあるにもかかわらず、出力に表示されるのは 1 つだけです。

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

4

5 に答える 5

2

@NPEが正しいことに加えて(これは宿題だと思います)、重複した要素が見つかった限り、まったく同じヘッドで関数を呼び出すことを検討する必要があります。counter重複が (もう) 見つからない場合にのみ、次の要素 (つまり、 increase ) を使用します。

于 2013-03-16T17:32:31.353 に答える
1

これを試してください:

    public static void removeDuplicates(ArrayList<Integer> list, int counter){


        if(list == null){
            throw new NullPointerException();
        }

        if(counter < list.size()){
            if(list.contains(list.get(counter))){
                if(list.lastIndexOf(list.get(counter))!=counter)
                {
                    list.remove(list.lastIndexOf(list.get(counter)));
                    counter--;
                }
            }
            removeDuplicates(list, ++counter);
        }

    }
于 2013-03-16T17:35:10.640 に答える
1

list.remove()list.size()つまり、アイテムを削除して を進めるたびに、1 つスキップすることになりcounterます。

于 2013-03-16T17:28:51.080 に答える
0

私の最初の質問は、なぜ再帰を使用しているのですか? 古いリストから新しいリストを作成する方がはるかに簡単です。

文字列から項目を削除して一連の呼び出しを実行すると、出力が期待どおりであることがわかります。

パス 1 は最後の 100 を削除します

100、200、200、300、400、300、100、500、500、400、100、400、100

パス 2 は最後の 200 を削除します

100、200、300、400、300、100、500、500、400、100、400、100

パス 3 は最後の 300 を削除します

100、200、300、400、100、500、500、400、100、400、100

パス 4 は最後の 400 を削除します

100、200、300、400、100、500、500、400、100、100

パス 5 は最後の 100 を削除します

100、200、300、400、100、500、500、400、100

パス 6 は最後の 500 を削除します

100、200、300、400、100、500、400、100

パス 7 では何も削除されません パス 8 では何も削除されません

于 2013-03-16T17:33:09.373 に答える
0

試す

    if (counter < list.size()) {
        int i = list.lastIndexOf(list.get(counter));
        if (i > counter) {
            list.remove(i);
        } else {
            counter++;
        }
        removeDuplicates(list, counter);
    }
于 2013-03-16T17:45:42.503 に答える