JAVA如何从两个列表中删除重复对象
第二个问题,是第一个问题的继续。 我有两个字符串列表。有一个字符串列表(asu)-M1、M2、M3。。。以及字符串(rzs)-M1、M2、M3及其所有可能组合的列表。每个元素(asu)(例如M1)需要在(RZ)(M1,M1M2,…)中找到一个包含(例如M1)的元素。示例:从(asu)获取M1,并将在(rzs)中开始搜索重复(包含)。我们在(rzs)中发现了M1M2,它包含M1。之后,我们应该从列表中删除这两个元素。非常感谢无名称帮助修改此代码。但是程序总是失败,因为AbstractList.remove错误。请帮助实现逻辑和调优代码JAVA如何从两个列表中删除重复对象,java,list,object,duplicates,Java,List,Object,Duplicates,第二个问题,是第一个问题的继续。 我有两个字符串列表。有一个字符串列表(asu)-M1、M2、M3。。。以及字符串(rzs)-M1、M2、M3及其所有可能组合的列表。每个元素(asu)(例如M1)需要在(RZ)(M1,M1M2,…)中找到一个包含(例如M1)的元素。示例:从(asu)获取M1,并将在(rzs)中开始搜索重复(包含)。我们在(rzs)中发现了M1M2,它包含M1。之后,我们应该从列表中删除这两个元素。非常感谢无名称帮助修改此代码。但是程序总是失败,因为AbstractList.re
Imports..........
public class work{
List<string> asu = Arrays.asList("M1","M1","M1","M3","M4","M5","M1","M1","M1","M4","M5","M5");
List<string> rzs = Arrays.asList("M1","M2","M3","M4","M5",
"M1M2","M1M3","M1M4","M1M5","M2M3","M2M4","M2M5","M3M4","M3M5","M4M5"
,"M1M2M3","M1M2M4","M1M2M5","M1M3M4","M1M3M4","M1M4M5","M2M4","M2M5");
public static void main(String[] args) {
work bebebe = new work();
bebebe.mywork();
}
List<string> tmp1 = new ArrayList<string>();
List<string> tmp2 = new ArrayList<string>();
System.out.println(Arrays.deepToString(rzs));
System.out.println(Arrays.deepToString(asu));
for (string curr : asu){
for (string currRzs : rzs){
System.out.println("New iteration ");
if (currRzs.contains(curr)) {
System.out.println("Element ("+curr+") in ASU =
element ("+currRzs+") in RZS");
if(tmp1.contains(curr) == false)
tmp1.add(curr);
if(tmp2.contains(currRzs) == false)
tmp2.add(currRzs);
}
}
}
for (string curr : tmp1){
asu.remove(curr);
}
for (string currRzs : tmp2){
rzs.remove(currRzs);
}
导入。。。。。。。。。。
公开课{
List asu=数组。asList(“M1”、“M1”、“M1”、“M3”、“M4”、“M5”、“M1”、“M1”、“M4”、“M5”、“M5”);
List rzs=Arrays.asList(“M1”、“M2”、“M3”、“M4”、“M5”,
“M1M2”、“M1M3”、“M1M4”、“M1M5”、“M2M3”、“M2M4”、“M2M5”、“M3M4”、“M3M5”、“M4M5”
“M1M2M3”、“M1M2M4”、“M1M2M5”、“M1M3M4”、“M1M3M4”、“M1M4M5”、“M2M4”、“M2M5”);
公共静态void main(字符串[]args){
工作bebebe=新工作();
bebe.mywork();
}
List tmp1=new ArrayList();
List tmp2=newarraylist();
System.out.println(Arrays.deepToString(rzs));
System.out.println(Arrays.deepToString(asu));
for(字符串货币:asu){
for(字符串currRzs:rzs){
System.out.println(“新迭代”);
if(当前包含(当前)){
System.out.println(“元素(“+curr+”)在ASU中=
RZS中的元素(“+currRzs+”);
如果(tmp1.contains(curr)==false)
tmp1.添加(当前);
if(tmp2.contains(currRzs)==false)
tmp2.添加(currRzs);
}
}
}
用于(字符串电流:tmp1){
asu.移除(当前);
}
for(字符串currzs:tmp2){
rzs.移除(当前rzs);
}
不要使用foreach循环从列表中删除项。使用classic for和iterator over元素,删除项时减少iterator。不要使用foreach循环从列表中删除项。使用classic for和iterate over元素,删除项时减少iterator。要在迭代时安全地删除元素,请使用iterator.re移动方式:
如果基础的
在迭代以任何方式进行时修改集合
而不是通过调用此方法
要在迭代时安全地删除元素,请使用Iterator.remove方法: 如果基础的 在迭代以任何方式进行时修改集合 而不是通过调用此方法
您应该尝试使用removeAll()或retainal()方法进行收集 例如:
List<String> aList = new ArrayList<String>();
aList.add("a");
aList.add("b");
aList.add("c");
aList.add("d");
aList.add("e");
List<String> bList = new ArrayList<String>();
bList.add("b");
bList.add("e");
bList.add("d");
aList.removeAll(bList);
将为您提供列表中剩余的“b”、“d”和“e”元素
retainAll()
用于删除调用集合中不属于给定集合的所有元素
removeAll()
用于从另一个集合中删除集合的所有元素
所以,这完全取决于您的用例
编辑
如果在任何情况下,您希望在有条件地迭代时从这些集合中删除某些元素,那么您应该首先获得迭代器
,然后在其上调用remove()
方法
比如:
您应该尝试使用removeAll()或retainal()方法进行收集 例如:
List<String> aList = new ArrayList<String>();
aList.add("a");
aList.add("b");
aList.add("c");
aList.add("d");
aList.add("e");
List<String> bList = new ArrayList<String>();
bList.add("b");
bList.add("e");
bList.add("d");
aList.removeAll(bList);
将为您提供列表中剩余的“b”、“d”和“e”元素
retainAll()
用于删除调用集合中不属于给定集合的所有元素
removeAll()
用于从另一个集合中删除集合的所有元素
所以,这完全取决于您的用例
编辑
如果在任何情况下,您希望在有条件地迭代时从这些集合中删除某些元素,那么您应该首先获得迭代器
,然后在其上调用remove()
方法
比如:
您可以使用方法从列表中删除元素集合,而不是逐个删除。使用 而不是
for (string curr : tmp1)
{
asu.remove(curr);
}
和使用
rzs.removeAll(tmp2);
而不是
for (string currRzs : tmp2)
{
rzs.remove(currRzs);
}
更新我找出了您的问题。问题在于Arrays.asList()方法。
据 asList()返回“由指定数组支持的固定大小的列表”。如果要调整数组的大小,必须创建一个新的列表并复制旧数据。那么列表将不会由同一数组实例支持 因此,为列表创建一个重复的ArrayList
List<string> asuDuplicat = new ArrayList<string>(asu);
List<string> rzsDuplicat = new ArrayList<string>(rzs);
您可以使用方法从列表中删除元素集合,而不是逐个删除。使用 而不是
for (string curr : tmp1)
{
asu.remove(curr);
}
和使用
rzs.removeAll(tmp2);
而不是
for (string currRzs : tmp2)
{
rzs.remove(currRzs);
}
更新我找出了您的问题。问题在于Arrays.asList()方法。
据 asList()返回“由指定数组支持的固定大小的列表”。如果要调整数组的大小,必须创建一个新的列表并复制旧数据。那么列表将不会由同一数组实例支持 因此,为列表创建一个重复的ArrayList
List<string> asuDuplicat = new ArrayList<string>(asu);
List<string> rzsDuplicat = new ArrayList<string>(rzs);
您可以使用Set而不是List,它将自动删除重复的元素…您可以使用Set而不是List,它将自动删除重复的元素…
第二个问题,这是第一个问题的继续
-提供链接是一个很好的做法,您是否获得UnsupportedOperationException?是的,我已获得UnapportedOperationException第二个问题,这是第一个问题的继续部分
-提供链接是一种良好的做法,您是否会获得不支持的ortedOperationException?y
asuDuplicat.removeAll(tmp1);
rzsDuplicat.removeAll(tmp2);