使用另一个列表从列表中删除元素
Deleting elements from list using another list
我正在尝试从 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 的初学者,正在尝试学习集合。
有一个内置方法可以做到这一点:
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()
只检查是否有下一个元素。它 returns true
或 false
,而不是元素本身。以下是解决此问题的方法:
while (i.hasNext()) {
if (list2.contains(i.next())) {
i.remove();
}
}
您还可以迭代 list2
元素并将它们从 list1
中删除:
for (String el : list2) {
list1.remove(el);
}
在使用 List.contains()
检查元素的循环中,您传递的是一个布尔值(i.hasNext()
returns 迭代器是否有更多元素)而不是元素。这会导致循环无限地 运行 因为你永远不会调用 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();
}
}
我正在尝试从 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 的初学者,正在尝试学习集合。
有一个内置方法可以做到这一点:
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()
只检查是否有下一个元素。它 returns true
或 false
,而不是元素本身。以下是解决此问题的方法:
while (i.hasNext()) {
if (list2.contains(i.next())) {
i.remove();
}
}
您还可以迭代 list2
元素并将它们从 list1
中删除:
for (String el : list2) {
list1.remove(el);
}
在使用 List.contains()
检查元素的循环中,您传递的是一个布尔值(i.hasNext()
returns 迭代器是否有更多元素)而不是元素。这会导致循环无限地 运行 因为你永远不会调用 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();
}
}