4

文字列の ArrayList があり、ArrayList の奇妙な要素、つまり list.remove(1)、list.remove(3)、list.remove(5) などを削除しようとしています。

これは、IllegalStateException エラーをスローする使用しようとしているコードです。

int i = 0;
    for (Iterator<String> it = words.iterator(); it.hasNext(); )
    {
        if (i % 2 != 0 && it.hasNext())
        {
            it.remove();
        }
        i++;
    }

これを行うためのより良い(機能する)方法はありますか?

4

8 に答える 8

6
int i = 0;
    for (Iterator<String> it = words.iterator(); it.hasNext(); )
    {
        it.next(); // Add this line in your code
        if (i % 2 != 0)
        {
            it.remove();
        }
        i++;
    }
于 2013-03-28T05:49:15.257 に答える
2

から始まるすべての要素を削除するには、このようなことを試すことができますwords[1]。インデックスが奇数かどうかを確認する必要はありません。要素を削除するiと、インクリメントするだけで次の奇数になります。

int i = 1;

while (i < words.size()) {
    words.remove(i++);
}
于 2013-03-28T05:44:57.057 に答える
2

この配列を複製するか、その奇妙な要素を別の配列にコピーする必要があります。反復時に同じオブジェクトが使用されたため、インデックスを削除すると状態が変更されました。

int i = 0;
    List<String> list = new ArrayList<String>();
    List<String> words = new ArrayList<String>();
    for (String word:words)
    {
        if (i % 2 != 0)
        {

            //it.remove();
            list.add(word);
        }

        i++;
    }
    words.removeAll(list);

このリストを単語リストオブジェクトに渡して、これをすべて削除するだけです

words.removeAll(list);
于 2013-03-28T05:45:29.977 に答える
0

要素を調べる必要がないため、反復子は使用しません。使用するだけList.remove(index)です:

for (int i = words.size() - 1; i >=0; i--) {
    if (i % 2 == 1) {
        words.remove(i);
    {
}

要素を削除すると、その後のすべてが左にシャッフルされるため、このアプローチではカウントアップではなく、カウントダウンする必要があることに注意してください

リストが不変の場合 (例外について説明します)、最初にコピーを作成します。

words = new ArrayList(words);
于 2013-03-28T05:48:07.417 に答える
0

これを使うだけです。

for (int i = 1; i < list.size(); i++) {
    list.remove(i);
}
于 2013-03-28T05:48:17.760 に答える
0

以下も正常に動作します

public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(1, 2, 3,
                4, 5, 6, 7, 8, 9));

        for (int i = 0; i < list.size(); i++) {
            System.out.println(i);
            list.remove(i);
        }
        System.out.println(list);
    }

降伏

[2, 4, 6, 8]
于 2013-03-28T05:48:25.150 に答える
0

next() を使用してから remove() を呼び出す必要があります ---

    int counter = 0;
    for (final Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
        iterator.next();
        if (++counter % 2 != 0) {
            iterator.remove();
        }
    }
于 2013-03-28T05:48:48.200 に答える
0
public static List<Integer> removeImpairElements(List<Integer> integers){
int j = 0; 
for(int i = 0 ; i < integers.size(); i++){
  if( i % 2 == 0){
    integers.set(j, integers.get(i));
    j++;
  }
}
int half = integers.size()%2==0 ? integers.size()/2 : integers.size()/2 + 1;  
integers.subList(half , integers.size()).clear();
return integers;

}

于 2018-10-11T22:18:07.337 に答える