0

最初の要素の複製である ArrayList 内のすべての要素を削除したいのですが、最初の要素は ArrayList に残しておいてください。forループでそれをやろうとしましたが、すべての重複を削除しませんでした。

for(int i = 1; i < arraylist.size(); i++) {
    if(arraylist.get(i) == v1)
       arraylist.remove(i);
}

v1 は、arraylist の最初の要素と同じです。ListIterator でも試してみましたが、最初の要素が削除されました

ListIterator<Integer> iterator = arraylist.listIterator();
while(iterator.hasNext()) {
  if(iterator.next().intValue() == v1)
  iterator.remove();
}

手伝ってくれませんか?

4

5 に答える 5

3

を削除するには、最初の要素を個別に読み取り、while loop残りの要素と比較する変数に格納する必要があります。

ListIterator<Integer> iterator = arraylist.listIterator();
int first = 0;
// Check if there is a first element
if (iterator.hasNext()) {
    first = iterator.next();

    // Iterate over the rest of the elements
    while(iterator.hasNext()) {
        // If this value is equal to `first`, remove it
        if(iterator.next().intValue() == first) {
            iterator.remove();
        }
    }
}
System.out.println(arrayList);

iterator.next()タイプの値を返しますInteger。を使用すると、プリミティブなintValue()が得られます。

ただし、プリミティブ自体と比較しているintので、呼び出す必要はまったくありませんintValue()。比較する前に、Integer自動的にから出されてプリミティブになりintます。したがって、ifwhileのステートメントを以下のステートメントに置き換えることもできます。

if(iterator.next() == first) {
    iterator.remove();
}

あなたの最初の方法に関する限り、あなたがループしているあなたIteratorを修正したいのであれば、常に使用してください。Listこれにより、厄介な問題に直面するのを防ぐことができますConcurrentModificationException


参照:

于 2013-02-17T19:37:48.283 に答える
1

Iteratorとそのメソッドを使用して正しい方法を実行していますremovenext()ただし、最初の要素を調べて削除しないようにするには、ループ自体の前にに呼び出しを追加する必要があります。

ListIterator<Integer> iterator = arraylist.listIterator();
iterator.next(); // pass the first element.
while(iterator.hasNext()) {
  if(iterator.next().intValue() == v1)
  iterator.remove();
}

他の人が言ったこととは反対に、v1がの場合は「等しい」を使用する必要はありませんint。これは事実のようです。

于 2013-02-17T19:37:45.577 に答える
1

カウントダウン(アップではない):

Object v1 = arraylist.get(0);
for (int i = arraylist.size() - 1; i > 1; i--) {
    if (arraylist.get(i).equals(v1))
       arraylist.remove(i);
}

要素を削除すると、残りの要素がシャッフルされるため、カウントダウンする必要があります。

また、(示されているように)に変更==する必要があります。.equals()

于 2013-02-17T19:36:20.263 に答える
0
int v1 = arraylist.get(0);
for(int i = 0; i < arraylist.size(); i++) {
    if(arraylist.get(i) == v1){
       arraylist.remove(i);
       i--;
    }
}

イテレータアプローチを使用したくない場合:他の答えは、ゼロからインデックスを作成する必要があるという点で正しいです(最初のアプローチも削除する場合)が、反復変数をデクリメントする必要もあります(i--行)リストから要素を削除するたびに、remove()でリストの長さを変更しているためです。

于 2013-02-17T19:39:10.830 に答える
0

反復処理中に配列 (または反復可能なリスト) から要素を削除する場合は注意が必要です。

私の経験では、最も簡単な方法は、新しいリストを作成することです。そうすることを検討できますか?

コードを見て、まず比較のために「==」よりも「equals」を使用することを忘れないでください(.equals は「意味的に同等」を意味するため、ここで必要なものだと思います)。(編集:オートボクシングのためにここでは問題にならないかもしれませんが、それでも良い習慣です)

しかし、これでもうまくいきません:

for (int i = 1; i < arraylist.size(); i++) {
    if (arraylist.get(i).equals(v1))
        arraylist.remove(i);
}

3 つの整数の ArrayList があると想像してみてください。すべて同じです。i == 1 の場合、インデックス 1 の要素がインデックス 0 の値と比較され、削除されます。しかし、その後、インデックス 2 の要素がインデックス 1 の要素になり、for ループ カウンターがインクリメントされるため、リストの最後のエントリを削除するには「欠落」します。

このようなものをお勧めできますか?

List<Integer> newlist = new ArrayList<Integer>();
newlist.add(v1);
for (Integer integer : arraylist) {
    if (!integer.equals(v1))
        newlist.add(integer);
}

頑張ってください!

PS 勇気がある場合は、次のような簡単な方法を実行できるかもしれません: CollectionUtils.filter(Collection,Predicate)

CollectionUtils.filter(arraylist.subList(1, arraylist.size()), new Predicate() {
    @Override
    public boolean evaluate(Object o) {
        return !v1.equals(o);
    }
});
于 2013-02-17T19:53:13.803 に答える