4

remove()ここにオブジェクトの汎用配列リストがあり、特定の要素を削除したいのですが、問題は、forループでリストを反復すると、削除するたびに要素がシフトされるため、単純なシーケンスを実行できないことです。

ありがとう

4

6 に答える 6

17

イテレータを使用して要素を削除します

好き

Iterator itr = list.iterator();
String strElement = "";
while (itr.hasNext()) {
    strElement = (String) itr.next();
    if (strElement.equals("2")) {
        itr.remove();
    }
}
于 2012-07-11T09:01:41.767 に答える
2

この方法でリストを繰り返すことができます...

public void clean(List<Kopek> kopeks) {
  for(Kopek kopek : kopeks) {
    if (kopek.isDirty())
      kopeks.remove(kopek);
  }
}

これは...に相当します

public void clean1(List<Kopek> kopeks) {
  Iterator<Kopek> kopekIter = kopeks.iterator();

  while (kopekIter.hasNext()) {
    Kopek kopek = kopekIter.next();
    if (kopek.isDirty())
      kopeks.remove(kopek);
  }
}

これをしないでください...(あなたがすでに観察した理由のために。)

public void clean(List<Kopek> kopeks) {
  for(int i=0; i<kopeks.size(); i++) {
    Kopek kopek = kopeks.get(i);
    if (kopek.isDirty())
      kopeks.remove(i);
  }
}

ただし、オブジェクトではなくインデックスによる削除の方が効率的だと思います。リストはほとんどの場合ハッシュリストではないため、オブジェクトによる削除は効率的ではありません。

kopeks.remove(kopek);

vs

kopeks.remove(i);

移動するターゲットを適切に処理することにより、位置の削除を実現するには...

public void clean(List<Kopek> kopeks) {
  int i=0;
  while(i<kopeks.size()) {
    Kopek kopek = kopeks.get(i);
    if (kopek.isDirty()) // no need to increment.
      kopeks.remove(i);
    else
      i++;
  }
}
于 2012-07-11T09:28:46.563 に答える
1

削除したいオブジェクトがある場合は、ArrayList<T>次を使用できます。

mArrayList.remove(object);

または、を使用しIteratorてオブジェクトを削除できます。

while(iterator.hasNext()){
    if(iterator.next() == some condition for removal){
        iterator.remove();
    }
}
于 2012-07-11T09:05:26.040 に答える
1

ArrayListを調べながら、逆方向に繰り返して削除することができます。これには、後続の要素をシフトする必要がなく、先に進むよりもプログラミングが簡単であるという利点があります。

   List<String> arr = new ArrayList<String>();
   ListIterator<String> li = arr.listIterator(arr.size());

    // Iterate in reverse.
    while(li.hasPrevious()) {

        String str=li.previous();
        if(str.equals("A"))
        {
            li.remove();
        }
    }
于 2012-07-11T09:22:53.120 に答える
0

元のArrayListから削除するデータのインデックスの別のArrayListを作成し、forループでループしてそれらの要素を削除します。

ArrayList<Myobj> arr = new ArrayList<Myobj>();

for (Myobj o : arr){

  arr.remove(arr.indexOf(o));

 }
于 2012-07-11T09:05:31.187 に答える
0

イテレータを使用せずに問題を解決することもできます。削除するインデックスを取得し、降順で並べ替えてから、リストから削除するだけです。以下のコードを確認してください

Arraylist<obj> addlist = getlist();
List<Integer> indices = new ArrayList<Integer>();
    for(int i=0; i<addlist.size() ;i++){
        if(addlist.get(i).getDelete()){
            indices.add(i);

        }
    }
    Collections.sort(indices, Collections.reverseOrder());
    for (int i : indices)
        addlist.remove(i);
于 2012-07-11T09:40:16.907 に答える