web-dev-qa-db-ja.com

値をチェックしてArrayListから要素を削除する方法は?

特定の値を持つ要素を削除したいArrayListがあります...

例えば.

ArrayList<String> a=new ArrayList<String>();
a.add("abcd");
a.add("acbd");
a.add("dbca");

Arraylist、および.remove()メソッドを反復処理して要素を削除できることは知っていますが、反復中にそれを行う方法はわかりません。値「acbd」を持つ要素、つまり2番目の要素を削除するにはどうすればよいですか?

36
vikas devde

あなたの場合、どのオブジェクトを削除するかを知っているので、リストを繰り返す必要はありません。いくつかのオプションがあります。最初に、インデックスによってオブジェクトを削除できます(したがって、オブジェクトが2番目のリスト要素であることを知っている場合)。

 a.remove(1);       // indexes are zero-based

次に、文字列のfirstの出現を削除できます。

 a.remove("acbd");  // removes the first String object that is equal to the
                    // String represented by this literal

または、特定の値を持つすべての文字列を削除します。

 while(a.remove("acbd")) {}

コレクションにもっと複雑なオブジェクトがあり、特定のプロパティを持つインスタンスを削除したい場合は、もう少し複雑です。削除するオブジェクトと等しいオブジェクトでremoveを使用してそれらを削除することはできません。

そのような場合、通常、2番目のリストを使用して、削除するすべてのインスタンスを収集し、2番目のパスでそれらを削除します。

 List<MyBean> deleteCandidates = new ArrayList<>();
 List<MyBean> myBeans = getThemFromSomewhere();

 // Pass 1 - collect delete candidates
 for (MyBean myBean : myBeans) {
    if (shallBeDeleted(myBean)) {
       deleteCandidates.add(myBean);
    }
 }

 // Pass 2 - delete
 for (MyBean deleteCandidate : deleteCandidates) {
    myBeans.remove(deleteCandidate);
 }
54
Andreas_D

ワンライナー(Java8):

list.removeIf(s -> s.equals("acbd")); // removes all instances, not just the 1st one

(すべての反復を暗黙的に行います)

21
Andrejs

次のように Iterator を使用する必要があります。

Iterator<String> iterator = a.iterator();
while(iterator.hasNext())
{
    String value = iterator.next();
    if ("abcd".equals(value))
    {
        iterator.remove();
        break;
    }
}

つまり、 remove(int index) または remove(Object obj) を使用できます。これらは ArrayList クラスによって提供されます。ただし、ループを繰り返し処理しているときにこれらのメソッドを呼び出すと、 ConcurrentModificationException が発生するため、これは機能しません。

for(String str : a)
{
    if (str.equals("acbd")
    {
        a.remove("abcd");
        break;
    }
}

しかし、これは(ループの内容を繰り返し処理していないため):

a.remove("acbd");

より複雑なオブジェクトがある場合は、 equals メソッドをオーバーライドする必要があります。

11
npinti

これらの質問については、 API を確認する必要があります。

remove メソッドを使用できます。

a.remove(1);

OR

a.remove("acbd");
3
Azodious

これにより出力が得られます。

    ArrayList<String> l= new ArrayList<String>();

    String[] str={"16","b","c","d","e","16","f","g","16","b"};
    ArrayList<String> tempList= new ArrayList<String>();

    for(String s:str){
        l.add(s);
    }

    ArrayList<String> duplicates= new ArrayList<String>();

    for (String dupWord : l) {
        if (!tempList.contains(dupWord)) {
            tempList.add(dupWord);
        }else{
            duplicates.add(dupWord);
        }
    }

    for(String check : duplicates){
        if(tempList.contains(check)){
            tempList.remove(check);
        }
    }

    System.out.println(tempList);

出力、

[c, d, e, f, g]
1
AnjuT

myList.remove(myObject)を使用してください。

クラスのequalsメソッドを使用します。 http://docs.Oracle.com/javase/6/docs/api/Java/util/List.html#remove(Java.lang.Object )を参照してください

ところで、もっと複雑なことがある場合は、述語などでそれを行うための多数のユーティリティを備えたguavaライブラリをチェックアウトする必要があります。

1
poussma

一致条件に基づいて配列リストから要素を削除するスニペットは次のとおりです。

List<String> nameList = new ArrayList<>();
        nameList.add("Arafath");
        nameList.add("Anjani");
        nameList.add("Rakesh");

Iterator<String> myItr = nameList.iterator();

    while (myItr.hasNext()) {
        String name = myItr.next();
        System.out.println("Next name is: " + name);
        if (name.equalsIgnoreCase("rakesh")) {
            myItr.remove();
        }
    }
0
Arafath

以下のコードを試してください:

 public static void main(String[] args) throws Exception{
     List<String> l = new ArrayList<String>();
     l.add("abc");
     l.add("xyz");
     l.add("test");
     l.add("test123");
     System.out.println(l);
     List<String> dl = new ArrayList<String>();
    for (int i = 0; i < l.size(); i++) {
         String a = l.get(i);
         System.out.println(a); 
         if(a.equals("test")){
             dl.add(a);
         }
    }
    l.removeAll(dl);
     System.out.println(l); 
}

あなたの出力:

 [abc, xyz, test, test123]
abc
xyz
test
test123
[abc, xyz, test123]
0
Nitin Vavdiya

listインターフェースで使用可能なcontains()メソッドを使用して、リストに値が存在するかどうかを確認します。その要素が含まれている場合は、そのインデックスを取得して削除します

0
Renjith

イテレータを使用してリストをループし、必要なオブジェクトを削除します。

    Iterator itr = a.iterator();
    while(itr.hasNext()){
        if(itr.next().equals("acbd"))
            itr.remove();
    }
0
rai.skumar