使用其他列表从列表中删除元素

时间:2015-05-16 09:04:28

标签: java collections

我正在尝试删除list1中list1的元素

    package listCollection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;



public class Arry2List {

    public static void main(String[] args) {


        String[] s = {"INDIA" ,"JAPAN","THAILAND","MALAYSIA"};
        ArrayList<String> list1= new ArrayList<String>();
        String[] s1 = {"THAILAND","MALAYSIA"};
        ArrayList<String> list2= new ArrayList<String>();

        for(String temp : s)
        {
            list1.add(temp);
        }
        for(String temp : s1)
        {
            list2.add(temp);
        }


        //removing elements from list1 that are in list2


        System.out.println("In list1 **************");
        for (String t : list1)
        {
            System.out.println(t);
        }
        System.out.println("In list2 **************");
        for (String t1 : list2)
        {
            System.out.println(t1);
        }
        //editlist(list1,list2);
        Iterator<String> i=list1.iterator();

          while( i.hasNext() )
          {
               if ( list2.contains( i.hasNext() ) )
               {
                   i.remove();
               }

          }
        System.out.println("In list1 again **************");

        for(int i1 =0;i1<list1.size();i1++)
        {
            System.out.println(list1.get(i1));
        }


    }




    }

输出应该是INDIA,JAPAN。 List1应该只包含那些不在list2中的元素。

我是Core Java的初学者,并尝试学习集合。

2 个答案:

答案 0 :(得分:1)

在使用List.contains()检查元素的循环中,您传递一个布尔值(i.hasNext()返回迭代器是否有更多元素)而不是元素。这会导致循环无限运行,因为您从不调用Iterator.next()来获取下一个元素。你应该使用:

if (list2.contains(i.next())) {

而不是

if (list2.contains(i.hasNext())) {

最好还是将下一个元素保存在变量中以便重复使用:

while (i.hasNext()) {
    String element = i.next();
    if (list2.contains(element)) {
        i.remove();
    }
}

答案 1 :(得分:0)

有一种内置方法可以做到这一点:

list1.removeAll(list2)

[编辑]

您可以使用Arrays.asList:

更轻松地创建列表
List<String> list1 = new ArrayList<String>(Arrays.asList("INDIA", "JAPAN", "THAILAND", "MALAYSIA"));
List<String> list2 = Arrays.asList("THAILAND", "MALAYSIA");
list1.removeAll(list2);

[EDIT2]

Arrays.asList生成不可修改的列表,因此我们必须使用它来初始化可修改的列表。

[EDIT3]

您的代码无法正常工作,因为您无法推进迭代器。 i.hasNext()仅检查是否存在下一个元素。它返回truefalse,而不是元素本身。以下是解决此问题的方法:

    while (i.hasNext()) {
        if (list2.contains(i.next())) {
            i.remove();
        }
    }

您还可以迭代list2元素并将其从list1中移除:

    for (String el : list2) {
        list1.remove(el);
    }