如何通过检查其值来从ArrayList中删除元素?

vik*_*vde 40 java collections arraylist

我有ArrayList,我想从中删除一个具有特殊价值的元素......

例如.

ArrayList<String> a=new ArrayList<String>();
a.add("abcd");
a.add("acbd");
a.add("dbca");
Run Code Online (Sandbox Code Playgroud)

我知道我们可以迭代arraylist和.remove()方法来删除元素,但我不知道如何在迭代时这样做.如何删除值为"acbd"的元素,即第二个元素?

And*_*s_D 61

在您的情况下,不需要遍历列表,因为您知道要删除哪个对象.你有几个选择.首先,您可以通过索引删除对象(因此,如果您知道,该对象是第二个列表元素):

 a.remove(1);       // indexes are zero-based
Run Code Online (Sandbox Code Playgroud)

然后,您可以删除字符串的第一个出现:

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

或者,删除具有特定值的所有字符串:

 while(a.remove("acbd")) {}
Run Code Online (Sandbox Code Playgroud)

如果您的集合中有更复杂的对象并且想要删除具有特定属性的实例,则会更复杂一些.因此,您无法通过使用remove与要删除的对象相同的对象来删除它们.

在这种情况下,我通常使用第二个列表来收集我要删除的所有实例,并在第二遍中删除它们:

 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);
 }
Run Code Online (Sandbox Code Playgroud)

  • `removeAll`需要一个集合,所以你需要`list.removeAll(Arrays.asList("acbd"));` (4认同)
  • @Andreas_D 要添加到您的评论中,如果列表中的项目是整数类型,则您的删除方法将引发异常。例如`Mylist=[2,3,5]`,尝试通过`Mylist.remove(5)` 删除`5`。 (2认同)

And*_*ejs 24

单线程(java8):

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

(隐含所有迭代)

  • 也有助于删除对象,这取决于一个属性,如下所示:`list.removeIf(obj -&gt; obj.getAttribute().equals(otherObj.getAttribute()))`; (3认同)
  • 您可以将其缩短为`list.removeIf("abcd"::equals);`。 (2认同)

npi*_*nti 12

你需要像这样使用Iterator:

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

话虽这么说,您可以使用ArrayList类提供的remove(int index)remove(Object obj).但是请注意,在迭代循环时调用这些方法会导致ConcurrentModificationException,因此这将不起作用:

for(String str : a)
{
    if (str.equals("acbd")
    {
        a.remove("abcd");
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

但这会(因为你没有迭代循环的内容):

a.remove("acbd");
Run Code Online (Sandbox Code Playgroud)

如果您有更复杂的对象,则需要覆盖equals方法.


Jay*_*ini 5

对于java8,我们可以简单地使用removeIf函数

listValues.removeIf(value -> value.type == "Deleted");
Run Code Online (Sandbox Code Playgroud)

  • 小心这一点 - .equals() 对我有用,而 == 没有。 (2认同)