2

重複する要素を削除したいので、ArrayList を反復処理して、2 つの連続する要素を比較します。(人は比較可能)

ArrayList<Person> persons = getHelper().findAllPersons();
Collections.sort(persons);
ListIterator<Person> it = persons.listIterator();
if(it.hasNext()) {
    Person tmp = it.next();
    while(it.hasNext()) {
        if(tmp.getLastDiscovered() == it.next().getLastDiscovered()) {
            getHelper().delete(tmp);
        }
    tmp = it.next();
    }
}

で NoSuchElementException を取得しますtmp = it.next();

while(it.hasNext())それを防ぐべきではないですか?

4

4 に答える 4

5

it.next()問題は、イテレータを 2 回進める 2 回呼び出すことです。

副作用を繰り返さないように、値を保存する必要があります。

    Person person = it.next();
    if (tmp.getLastDiscovered() == person.getLastDiscovered()) {
        getHelper().delete(tmp);
    }
    tmp = person;

または、 for-each ループを使用して、イテレータとやり取りする必要がないようにすることもできます (すべてPersonが null ではないと仮定します)。

Person tmp = null;
for (Person person : persons) {
    if (tmp != null && tmp.getLastDiscovered() == person.getLastDiscovered()) {
        getHelper().delete(tmp);
    }
    tmp = person;
}
于 2013-05-10T14:41:55.827 に答える
1

it.next()呼び出しごとに(潜在的に)2回呼び出しているit.hasNext()ため、エラーになります。

重複を削除したい場合は、(適切な Comparator を提供する) TreeSetに list を入力してみませんか? a のセマンティクスは、Set要素の異なるセットを持つようなものです。

于 2013-05-10T14:42:32.737 に答える
0

JDK 1.5.0 以降を使用している場合 (2004 年にリリースされたため、おそらくそうです)、foreach ループを使用してイテレータを完全に不要にし、コードを大幅に簡素化できます。

ArrayList<Person> persons = getHelper().findAllPersons();
Collections.sort(persons);
for (Person person : persons) {
    if(tmp.getLastDiscovered() == person.getLastDiscovered()) {
        getHelper().delete(tmp);
    }
}
于 2013-05-10T14:46:33.273 に答える