1

我有两个列表,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)

如果 name in List<Item>is equalsList<String>相同,则从 中删除元素List<Item>。我怎样才能从中删除元素List<Item>

4

4 回答 4

4

好吧,你有多个问题,所以这里有一个可能的解决方案(如果你想从 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;
    }
  }
}
于 2012-06-04T12:10:19.700 回答
2

如果您需要删除 2 个列表中不常见的数据,请尝试:

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以不删除所有元素。

于 2012-06-04T12:39:10.950 回答
1

在您的内部for循环中,您it1.remove();(最终)多次调用,以便it1.next()while循环开始时进行一次调用。

您不能it1.remove();多次调用单个it1.next()

用于解释详细信息javadocsIterator.remove()

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;
    }
}
于 2012-06-04T11:47:36.980 回答
1

提供的解决方案将起作用,但是:

我认为 aHashMap<String, Item> list1将是一个更好的数据类型。它比List.

于 2012-06-04T13:50:29.507 回答