1

私は2つのリストを持っています,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>ますか?

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

提供されたソリューションは機能しますが、次のようになります。

私はaHashMap<String, Item> list1がより良いデータ型になると思います。よりも速く決定的Listです。

于 2012-06-04T13:50:29.507 に答える
1

内部forループでは、it1.remove();(最終的には) 複数回呼び出して、ループit1.next()の先頭で1 回の呼び出しを行いwhileます。1回の通話で複数回の

通話はできませんit1.remove();it1.next()

詳細については、expalinsjavadocsIterator.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 に答える