Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA如何从两个列表中删除重复对象_Java_List_Object_Duplicates - Fatal编程技术网

JAVA如何从两个列表中删除重复对象

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

第二个问题,是第一个问题的继续。 我有两个字符串列表。有一个字符串列表(asu)-M1、M2、M3。。。以及字符串(rzs)-M1、M2、M3及其所有可能组合的列表。每个元素(asu)(例如M1)需要在(RZ)(M1,M1M2,…)中找到一个包含(例如M1)的元素。示例:从(asu)获取M1,并将在(rzs)中开始搜索重复(包含)。我们在(rzs)中发现了M1M2,它包含M1。之后,我们应该从列表中删除这两个元素。非常感谢无名称帮助修改此代码。但是程序总是失败,因为AbstractList.remove错误。请帮助实现逻辑和调优代码

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);