57

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

例如。

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

我知道我们可以迭代 arraylist 和 .remove() 方法来删​​除元素,但我不知道如何在迭代时做到这一点。如何删除具有“acbd”值的元素,即第二个元素?

4

11 回答 11

82

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

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

或者,您可以删除第一次出现的字符串:

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

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

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

如果您的集合中有更复杂的对象并且想要删除具有特定属性的实例,则它有点复杂。这样您就无法通过使用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);
 }
于 2013-01-09T09:17:39.440 回答
44

单线(java8):

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

(所有的迭代都是隐式的)

于 2017-04-10T09:02:31.333 回答
15

您需要像这样使用迭代器

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

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

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

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

a.remove("acbd");

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

于 2013-01-09T09:13:04.443 回答
7

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

listValues.removeIf(value -> value.type == "Deleted");
于 2019-12-06T06:55:00.737 回答
4

你应该检查API这些问题。

您可以使用删除方法。

a.remove(1);

或者

a.remove("acbd");
于 2013-01-09T09:14:31.150 回答
2

这会给你输出,

    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]
于 2017-06-15T04:56:52.023 回答
1

只需使用myList.remove(myObject).

它使用类的equals方法。请参阅http://docs.oracle.com/javase/6/docs/api/java/util/List.html#remove(java.lang.Object )

顺便说一句,如果你有更复杂的事情要做,你应该查看 guava 库,它有很多实用程序可以用谓词等来做这件事。

于 2013-01-09T09:13:08.457 回答
1

使用迭代器遍历列表,然后删除所需的对象。

    Iterator itr = a.iterator();
    while(itr.hasNext()){
        if(itr.next().equals("acbd"))
            itr.remove();
    }
于 2013-01-09T09:14:26.067 回答
0

使用列表接口中可用的 contains() 方法检查列表中是否存在该值。如果它包含该元素,则获取其索引并将其删除

于 2013-01-09T09:14:09.700 回答
0

根据匹配条件从任何数组列表中删除元素的片段如下:

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();
        }
    }
于 2016-08-12T05:00:51.847 回答
0

试试下面的代码:

 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]
于 2017-03-17T06:43:14.877 回答