2013-08-05 84 views
1

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

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); 
      } 
+0

'第二个问题,这是继续first'的 - 这是很好的做法,提供链接 – Tala

+0

你得到UnsupportedOperationException异常? –

+0

是的,我有UnsupportedOperationException –

回答

2

你应该尽量利用的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); 

会给你的 “一” 和 “c” 留在ALIST

元素,同时,如果您尝试使用中的retainAll()方法:

aList.retainAll(bList); 

会给你的 “b”, “d” 和留在ALIST “E” 元素;

retainAll()被用于去除不属于给定的集合的一部分的调用集合的所有元素。

removeAll()被用于去除来自另一集合中的一个集合的所有元素。

所以,这一切都取决于你的使用情况。

编辑

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

像:

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

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

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

2

而迭代使用Iterator.remove方法要安全地删除元素:

如果底层 集合被修改,而迭代进行以任何方式比通过调用 其他迭代器的行为是未指定的这种方法。

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

而且它更容易通过简单地调用从另一个删除所有集合:

asu.removeAll(tmp1); 
2

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

asu.removeAll(tmp1); 

,而不是

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

,并使用

rzs.removeAll(tmp2); 

,而不是

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

更新
我跟踪你的问题。问题出在Arrays.asList()方法。
根据Arrays#asList

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

因此,创建一个重复的ArrayList的lists.Like这

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

使用asuDuplicatrzsDuplicat

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

而不是列表,您可以使用设置,这将自动删除重复的元素......

+0

我不能使用Set为我的情况。实际上,这个话题的主要问题在于一个对象的内容。 –

+0

我看到了...以及我只能说别人已经建议的内容... 使用Iterator的remove方法删除重复项...:D – Arctigor

相关问题