[英]Java Two List<?> Using Iterator remove element from one?
我有两个列表,List<String> and List<Item>.
public class Item {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
我的代码::
public class Twolist {
List<Item> list1 = new ArrayList<>();
List<String> list2 = new ArrayList<>();
public Twolist() {
Item item = new Item();
item.setName("itemname1");
list1.add(item);
item = new Item();
item.setName("itemname2");
list1.add(item);
item = new Item();
item.setName("itemname3");
list1.add(item);
item = new Item();
item.setName("itemname4");
list1.add(item);
item = new Item();
item.setName("itemname5");
list1.add(item);
item = new Item();
item.setName("itemname6");
list1.add(item);
item = new Item();
item.setName("itemname7");
list1.add(item);
item = new Item();
item.setName("itemname8");
list1.add(item);
// list 2 start here
list2.add("itemname2");
list2.add("itemname4");
list2.add("itemname6");
list2.add("itemname8");
Iterator<Item> it1 = list1.iterator();
while (it1.hasNext()) {
Item item2 = (Item) it1.next();
System.out.println(item2.getName());
for (int i = 0; i < list2.size(); i++) {
String str = list2.get(i);
if (item2.equals(str)) {
} else {
it1.remove();
}
}
}
System.out.println(list1.size());
}
public static void main(String[] args) {
new Twolist();
}
错误::
itemname1
Exception in thread "main" java.lang.IllegalStateException
at java.util.ArrayList$Itr.remove(ArrayList.java:804)
at com.samir.CollectionP.Twolist.<init>(Twolist.java:67)
at com.samir.CollectionP.Twolist.main(Twolist.java:78)
如果List<Item>
名称等于List<String>
相同,则从List<Item>
删除元素。 如何从List<Item>
删除元素?
好吧,您有多个问题,因此这是一个可能的解决方案(如果您想从list1中删除list2的元素):
for (int i = 0; i < list1.size(); i++) {
String s1 = list1.get(i).getName();
System.out.println(s1);
for (int j = 0; j < list2.size(); j++) {
String s2 = list2.get(j);
if(s1.equals(s2)){
list1.remove(i);
i--;
break;
}
}
}
如果您需要删除两个列表中不常见的数据,请尝试:
for (int i = 0; i < list1.size(); i++) {
String s1 = list1.get(i).getName();
System.out.println(s1);
boolean found = false;
for (int j = 0; j < list2.size(); j++) {
String s2 = list2.get(j);
if(s1.equals(s2)){
found = true;
break;
}
}
if(!found){
list1.remove(i);
i--;
}
}
您需要使用boolean found
的boolean found
,以便不删除所有元素。
在内部for
循环中,您正在调用it1.remove();
(最终)多次,以便在while
循环开始时对it1.next()
进行一次调用。
您不能调用它it1.remove();
一个it1.next()
多次
Iterator.remove()
的javadocs详细说明
class Item { String name; }
class SOF {
static List<Item> list1 = new ArrayList();
static List<String> list2 = new ArrayList();
static {
Iterator<Item> i = list1.iterator();
while (i.hasNext()) {
if (!exists(i.next().name)) {
i.remove();
}
}
}
static boolean exists(String s) {
for (String s2: list2) {
if (s2.equals(s2))
return true;
}
return false;
}
}
提供的解决方案将起作用,但是:
我认为HashMap<String, Item> list1
将是更好的数据类型。 它比List
快得多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.