ArrayListからアイテムを削除


100

私はArrayList仮定を持っていますlist、そしてそれは8つのアイテムAH を持っています、そして今list私はこれをどのように行うことができるかからint配列に保存された1,3,5ポジションのアイテムを削除したいと思います。

私はこれをしようとしています

ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
list.add("F");
list.add("G");
list.add("H");

int i[] = {1,3,5};

for (int j = 0; j < i.length; j++) {
    list.remove(i[j]);
}

しかし、最初に削除された配列の位置が変更された後、次の反復で間違った要素が削除されるか、例外が発生します。


インデックスの降順でそれを削除するのはどうですか(インデックスを並べ替え、次にインデックスが最も高い要素を最初に削除します)?
nhahtdh

1
あなたの論理には欠陥があります。確かに、各アイテムの位置について考えるのではなく、アイテム自体について考える必要があります。言い換えると、位置1、3、5を削除するのではなく、とListを使用してアイテムを削除します(それらがのどこにあるかを問わず)。それについて考えてください。equals("B")equals("D")equals("F")
Squonk、2012年

はい、アイテムを削除したいのですが、どのようにアイテムを一致させることができますか?実際には、この項目は実際にはリストビューにあり、選択すると、これをDBおよびアレイから削除し、アダプターとリストを更新します
Krishnakant Dalal

遅いオプション:2番目のリストに要素を追加したら反復し、最初のリストから削除して2番目のリストを反復します(オプションのステップ:2番目のリストを呼び出し元に返す)
SparK

回答:


133

この特定のケースでは、降順で要素を削除する必要があります。最初のインデックス5、次に3、それから1。これにより、望ましくない副作用なしにリストから要素が削除されます。

for (int j = i.length-1; j >= 0; j--) {
    list.remove(i[j]);
}

1
OPのArrayListにはStringsではなくIntegers が含まれています(それでもなお、私はあなたの意見に同意します)。
Alex Lockwood、2012年

@Alex:この回答は機能しますが、質問のOPのロジックと同じくらい欠陥があります。私たちは話しているArrayList<E>-なぜ誰かArrayListはその位置にあるものをテストするのではなく純粋に基づいた位置からオブジェクトを削除したいのですか?OPはのStringオブジェクトタイプとして使用している可能性ArrayListがありますが、OPの特定の状況を解決しても、ジェネリックのコーディング方法は本当に悪いです。
Squonk、2012年

3
はい、あなたに賛成です。しかし、OPはについての質問ArrayList<String>ではありません、ArrayList<E>
エイドリアンモンク2012年

私はこの答えに完全に同意しません、@ MisterSquonk ya ya確信しました、解決策は一般的でなければなりません。さらに、なぜ私は反対票を投じているのですか?
Mohammed Azharuddin Shaikh

66
大丈夫、聞いて...大したことは何なのかわからない。OPが彼のコードを投稿し、私は可能な修正を示す回答で応答しました。完全に一般的な解決策を提供することで、それ以上に上がらなかったことを残念に思います...しかし、私の知る限り、OPはプログラミングレッスンを求めていませんでした。彼は「なぜこのコードが機能しないのか」と尋ねていました。質問の解釈を変えたからといって、私が回答の反対票を投じたと非難しないでください。
Alex Lockwood

30

ArrayList使用して要素を削除できますListIterator

ListIterator listIterator = List_Of_Array.listIterator();

 /* Use void remove() method of ListIterator to remove an element from List.
     It removes the last element returned by next or previous methods.
 */
listIterator.next();

//remove element returned by last next method
listIterator.remove();//remove element at 1st position
listIterator.next();
listIterator.next();
listIterator.remove();//remove element at 3rd position
listIterator.next();
listIterator.next();
listIterator.remove();//remove element at 5th position

別のスレッドが同じコレクションを変更している可能性があり、ConcurrentModificationExceptionが発生する可能性があるため、Javaのコレクションからオブジェクトを削除するためにListIterator remove()メソッドを使用することをお勧めします。
Min2

10
 public void DeleteUserIMP(UserIMP useriamp) {
       synchronized (ListUserIMP) {
            if (ListUserIMP.isEmpty()) {
            System.out.println("user is empty");
        }  else {
            Iterator<UserIMP> it = ListUserIMP.iterator();
            while (it.hasNext()) {
                UserIMP user = it.next();
                if (useriamp.getMoblieNumber().equals(user.getMoblieNumber())) {
                    it.remove();
                    System.out.println("remove it");
                }
            }
            // ListUserIMP.remove(useriamp);

            System.out.println(" this user removed");
        }
        Constants.RESULT_FOR_REGISTRATION = Constants.MESSAGE_OK;
        // System.out.println("This user Deleted " + Constants.MESSAGE_OK);

    }
}

7

前に述べたように

iterator.remove()

おそらく、ループ中にリストアイテムを削除する唯一の安全な方法です。

イテレーターを使用したアイテムの削除について理解を深めるには、このスレッドをご覧ください。


私は賛成票を失望させません。あなたに完全に同意します。これが最も安全な方法です。
Simmant

3

私は配列iが昇順でソートされていると思いますが、これはIteratorを使用した別のソリューションで、より一般的です:

ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
list.add("F");
list.add("G");
list.add("H");

int i[] = {1,3,5};

Iterator<String> itr = list.iterator();
int pos = 0;
int index = 0;
while( itr.hasNext() ){
    itr.next();
    if( pos >= i.length ){
        break;
    }
    if( i[pos] == index ){
        itr.remove();
        pos++;
    }

    index++;
}

2

これはどう?考えてみてください

import java.util.ArrayList;

class Solution
{
        public static void main (String[] args){

             ArrayList<String> List_Of_Array = new ArrayList<String>();
             List_Of_Array.add("A");
             List_Of_Array.add("B");
             List_Of_Array.add("C");
             List_Of_Array.add("D");
             List_Of_Array.add("E");
             List_Of_Array.add("F");
             List_Of_Array.add("G");
             List_Of_Array.add("H");

             int i[] = {1,3,5};

             for (int j = 0; j < i.length; j++) {
                 List_Of_Array.remove(i[j]-j);
             }

             System.out.println(List_Of_Array);

        }


}

そして出力は

[A, C, E, G, H]

2

このようにしてみてください

ArrayList<String> List_Of_Array = new ArrayList<String>();
List_Of_Array.add("A");
List_Of_Array.add("B");
List_Of_Array.add("C");
List_Of_Array.add("D");
List_Of_Array.add("E");
List_Of_Array.add("F");
List_Of_Array.add("G");
List_Of_Array.add("H");

int i[] = {5,3,1};

for (int j = 0; j < i.length; j++) {
    List_Of_Array.remove(i[j]);
}


2

「=」を使用すると、2番目のリストの元のarraylistのレプリカが作成されますが、参照は同じであるため、一方のリストを変更すると、もう一方のリストも変更されます。「=」の代わりにこれを使用します

        List_Of_Array1.addAll(List_Of_Array);

2

arraylistのremove(int index)メソッドは、リスト内の指定された位置(index)にある要素を削除します。arraylistの項目を削除すると、後続の要素が左に移動します。

arraylistに{20,15,30,40}が含まれている場合の意味

私はメソッドを呼び出しました:arraylist.remove(1)

次に、データ15が削除され、30と40の2つの項目は1だけ左シフトされます。

このため、最初にarraylistのより高いインデックスアイテムを削除する必要があります。

だから..あなたの与えられた状況のために..コードは..

ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
list.add("F");
list.add("G");
list.add("H");

int i[] = {1,3,5};

for (int j = i.length-1; j >= 0; j--) {
    list.remove(i[j]);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.