Java的。如何从两个列表中删除重复的对象

时间:2013-08-05 10:45:55

标签: java list object duplicates

第二个问题,这是第一个问题。 我有两个字符串列表。有一个字符串列表(asu) - M1,M2,M3 ......以及一个字符串列表(rzs) - M1,M2,M3及其所有可能的组合。需要每个元素(asu)(例如M1)在(rzs)(M1,M1M2,...)中找到包含(例如M1)的元素。示例:从(asu)获取M1并将开始在(rzs)中搜索重复(包含)。我们在(rzs)中发现M1M2,它包含M1。之后我们应该从列表中删除这两个元素。非常感谢No Idea For Name帮助修改此代码。但程序总是失败,因为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);
           }

5 个答案:

答案 0 :(得分:2)

不要使用foreach循环从列表中删除项目。使用classic for和迭代元素,当删除item时,减少迭代器。

答案 1 :(得分:2)

要在迭代时安全地删除元素,请使用Iterator.remove方法:

  

如果是底层的,则未指定迭代器的行为   在迭代以任何方式进行时,都会修改集合   除了通过调用此方法。

Iterator<String> i = tmp1.iterator();
while (i.hasNext()) {
   i.next(); // must be called before remove
   i.remove();
}

通过简单地调用:

,更容易从另一个集合中删除所有集合
asu.removeAll(tmp1);

答案 2 :(得分:2)

您应该尝试使用Collection的removeAll()或retainAll()方法。

例如:

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

将为您提供aList

中的“a”和“c”元素

如果您尝试使用retainAll()方法:

aList.retainAll(bList);

会在aList中留下“b”,“d”和“e”元素;

retainAll()用于删除不属于给定集合的调用集合的所有元素。

removeAll()用于从另一个集合中删除集合的所有元素。

所以,这完全取决于你的用例。

修改

如果在任何情况下你想在有条件地迭代时从这些集合中删除一些元素,那么你应首先获得Iterator<Type>,然后在其上调用remove()方法。

像:

while(iterator.hasNext()){
    String str = iterator.next();

    if(str.equals('test')){
        iterator.remove();
    }
}

答案 3 :(得分:2)

您可以使用removeAll()方法从列表中删除元素集合,而不是逐个删除 使用

asu.removeAll(tmp1);

而不是

for (string curr : tmp1)
{
    asu.remove(curr);
}

并使用

rzs.removeAll(tmp2);  

而不是

for (string currRzs : tmp2)
{
     rzs.remove(currRzs);
}

更新
我找出了你的问题。问题在于 Arrays.asList()方法。
根据{{​​3}}

  

asList()返回“由指定数组支持的固定大小的列表”。如果要调整阵列大小,则必须创建一个新阵列并复制旧数据。然后列表将不会由同一个数组实例支持。

因此为列表创建一个重复的ArrayList。就像这个

 List<string> asuDuplicat = new ArrayList<string>(asu);  
 List<string> rzsDuplicat = new ArrayList<string>(rzs);  

使用asuDuplicatrzsDuplicat

 asuDuplicat.removeAll(tmp1);
 rzsDuplicat.removeAll(tmp2);

答案 4 :(得分:2)

而不是List你可以使用Set,它将自动删除重复的元素......