5

カスタム オブジェクトを含む ArrayList があります。私が望むのは、カスタム オブジェクトの name プロパティに応じて、配列から重複を削除することです。Set person = new TreeSet(); でこれを達成しようとしました。しかし、それは機能していません。セットがアドレスまたは名前プロパティ以外のものを比較しているためだと思います。そのため、重複を削除しないイテレータを使用しようとしています。これは私が得たものです。

ArrayList<Person> people = new ArrayList<Person>();
Iterator<Person> iterator = people.iterator();
while (iterator.hasNext()) {
   Person person = iterator.next();

   if (person.getName().equals(iterator.next().getName())) {
       iterator.remove();
   }
}
for (Person person : people) {
    System.out.println(person.getName());
}

重複が見られますが、ArrayList は変更されていません。助けが必要です。ありがとう!

4

4 に答える 4

10

私は同じ状況にあり、使用するこのソリューションを思いつきましたSortedSet。この場合、セットのコンパレータが 0 を返す原因となるオブジェクトは、セットに 1 回だけ挿入されます。

次に例を示します。

SortedSet<Person> persons = new TreeSet<Person>(new Comparator<Person>() {
    @Override
    public int compare(Person arg0, Person arg1) {
        return arg0.getName().compareTo(arg1.getName());
    }
});

に を挿入するPersonpersons、(プロパティに基づいてname) 重複は挿入されません。

そのため、反復してlist<Person>そのすべてのアイテムをセットに挿入しpersons、重複がないことを確認できます。したがって、残りは次のようになります。

Iterator<Person> iterator = people.iterator();
while(iterator.hasNext()) {
    persons.add(iterator.next());
}
people.clear();
people.addAll(persons); //Now, your people does not contain duplicate names
于 2013-05-22T12:03:05.167 に答える
2

オブジェクトをリスト内の次のオブジェクトとのみ比較するため、コードは現在壊れています。現在のアプローチを修正するには、各オブジェクトをリスト内の他のすべてのオブジェクトと比較する別のサブループが必要です。ネストされたイテレータでは面倒になるかもしれません。

代替案の 1 つは、新しいリストを定義し、それらが重複していないことを確認したら、項目を入力することです。これにより、イテレータのネストが回避されます。

equals最後に、このプロパティに基づいて比較するメソッドを定義し、オブジェクトを にスローする別のオプションがありますSet。こちらもお忘れhashCodeなく。

于 2013-05-22T11:59:12.347 に答える
0

.next() を記述するたびに、反復が 1 ステップ進みます。たとえば、リストに 10 人いるとします。最初の人を選び、iterator.next() を使用して次の人を確認します。2 番目の人をフェッチしますが、イテレータは現在 2 人目にあります。したがって、次の実行では、3 人目がフェッチされ、4 人目と比較されます。

あなたがすべきことは、1 人を選び、その名前をリスト内の 10 人全員の名前と比較してから、重複オブジェクトのすべてのインスタンスをリストから削除することです。

于 2013-05-22T12:01:11.550 に答える