2012-03-29 71 views
13

我修正了它。继承人我的新代码。从另一个arrayList中减去一个arrayList

//returns a new IntSet after subtracting a from b 
// .minus().toString() 
ArrayList<Integer> minusArray = new ArrayList<Integer>(); 

    minusArray.addAll(array1); 

    for(int i =0; i< minusArray.size(); i++){ 
     for(int j = 0; j < array2.size(); j++){ 
      if(minusArray.get(i).equals(array2.get(j))){ 
       minusArray.remove(i); 
       if(i == 0){ 
        ; 
       } 
       else if(j == 0){ 
        ; 
       } 
       else{ 
        i = 0; 
        j = 0; 
       } 
      } 
      else{} 
     } 
    } 

return minusArray; 

我有两个arrayLists,我想从另一个“减去”一个arrayList。例如,如果我有一个arrayList [1,2,3],并且我想要减去[0, 2, 4],则生成的arrayList应为[1,3]

我的代码在某些情况下工作,如arrayList1 = [4,6]arrayList2 = [6]它会给我一个结果[4]。但是,如果我尝试像[1,2,4][0,4,8]

我得到这个异常:

java.lang.IndexOutOfBoundsException: Index: 2, Size: 2 
    at java.util.ArrayList.rangeCheck(Unknown Source) 
    at java.util.ArrayList.get(Unknown Source) 
    at IntSet.minus(IntSet.java:119) 
    at IntSetDriver.main(IntSetDriver.java:62) 

下面是代码我想出了。我已经完成了对它的测试运行,对我来说我认为它应该可以工作。用户输入这些arrayLists并对它们进行预分类,我也不知道Hash或big-O。

ArrayList<Integer> minusArray = new ArrayList<Integer>(); 

    minusArray.addAll(array1); 

    for(int i =0; i< minusArray.size(); i++){ 
     for(int j = 0; j < array2.size(); j++){ 
      if(minusArray.get(i).equals(array2.get(j))){ 
       minusArray.remove(i); 
      } 
      else{} 
     } 
    } 

return minusArray; 

回答

2

你的问题是,在你的minusArray.remove(...)叫你可以缩小minusArray的大小。若要解决此问题,请从array.size()-1开始并向后计数到0

检查 - 即使这样也不能解决问题。您需要撤消循环的顺序

28

尝试使用org.apache.commons.collections.CollectionUtils类的减法方法。

返回包含a-b的新集合。返回的集合中每个元素e的基数将是e的基数,减去e在b中的基数,或者零,取其中较大者。

CollectionUtils.subtract(java.util.Collection中的一个,java.util.Collection中的B)

Apache Commons Collections

+0

什么是CS 251? – kukis 2014-08-07 06:03:39

+2

@kukis CS 251将是一所大学的第二年计算机科学课程。 – 2014-12-29 23:45:45

2

我猜你得到的范围问题,因为你已经淘汰的要素之一这改变了内部循环所寻找的东西(我知道在处理正常的列表和集合时会出现这个问题)。

我过去需要做的是创建一个需要删除的项目列表(即在原始列表中找到的项目)。迭代新列表并直接消除原始列表的元素,而不必让迭代器在其中移动。

6

使用索引遍历minusArray是做到这一点的一种方式,但我建议你利用contains(Object)方法,这将允许,那么你使用remove(Object)array2的特定元素。

当然,总是有它确实需要相当多的一切removeAll(Collection) ...

+0

+1为“正常”的方式来做到这一点。 – 2012-03-29 21:53:07

4

您可以使用org.apache.commons.collections.ListUtils,使所有要在只有一行=)

List resultList = ListUtils.subtract(list, list2); 
22

是否有某些原因,您不能简单地使用List.removeAll(List)?

List<Integer> one = new ArrayList<Integer>(); 
    one.add(1); 
    one.add(2); 
    one.add(3); 
    List<Integer> two = new ArrayList<Integer>(); 
    two.add(0); 
    two.add(2); 
    two.add(4); 
    one.removeAll(two); 
    System.out.println(one); 

    result: "[1, 3]" 
相关问题