我有ArrayList,我想从中删除一个具有特殊价值的元素......
例如。
ArrayList<String> a=new ArrayList<String>();
a.add("abcd");
a.add("acbd");
a.add("dbca");
我知道我们可以迭代arraylist和.remove()方法来删除元素,但我不知道如何在迭代时这样做。 如何删除值为“acbd”的元素,即第二个元素?
答案 0 :(得分:52)
在您的情况下,无需遍历列表,因为您知道要删除哪个对象。你有几个选择。首先,您可以通过索引删除对象(如果您知道,该对象是第二个列表元素):
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
并使用与您要删除的对象相同的对象时,无法删除它们。
在这种情况下,我通常使用第二个列表来收集我要删除的所有实例,并在第二遍中删除它们:
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);
}
答案 1 :(得分:21)
One-liner(java8):
list.removeIf(s -> s.equals("acbd")); // removes all instances, not just the 1st one
(隐含所有迭代)
答案 2 :(得分:11)
您需要使用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方法。
答案 3 :(得分:3)
答案 4 :(得分:1)
只需使用myList.remove(myObject)
。
它使用类的equals方法。见http://docs.oracle.com/javase/6/docs/api/java/util/List.html#remove(java.lang.Object)
顺便说一下,如果你有更复杂的事情要做,你应该查看番石榴库,它有十几个实用程序来做谓词等等。答案 5 :(得分:1)
这将为您提供输出
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]
答案 6 :(得分:0)
使用list()方法在list接口中可用来检查列表中是否存在该值。如果它包含该元素,则获取其索引并将其删除
答案 7 :(得分:0)
使用迭代器遍历列表,然后删除所需的对象。
Iterator itr = a.iterator();
while(itr.hasNext()){
if(itr.next().equals("acbd"))
itr.remove();
}
答案 8 :(得分:0)
根据匹配条件从任何arraylist中删除元素的片段如下:
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();
}
}
答案 9 :(得分: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]
答案 10 :(得分:0)
对于Java8,我们可以像这样简单地使用removeIf函数
listValues.removeIf(value -> value.type == "Deleted");