2012-03-29 3 views
13

私はそれを実際に修正しました。私の新しいコードがあります。別のarrayListから1つの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; 

私は2つのArrayListを持っていると私は別の1つのArrayListを「引く」しようとしています。たとえば、配列リスト[1,2,3]が1つあり、[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) 

ここで私が出ているコードがあります。私はそれを介してテストを実行していると私はそれが動作するはずだと思う。ユーザーがこれらの配列リストを入力し、それらが事前にソートされている、私はハッシュまたはビッグオーも知らない。

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を含む新しいコレクションを返します。返されるCollectionの各要素eのカーディナリティは、eの基数からbのeの基数を差し引いたもの、またはどちらか大きい方の値になります。 Apache Commons Collections

+0

CS 251とは何ですか? – kukis

+2

@kukis CS 251は、大学の2年次コンピュータサイエンスコースです。 –

2

から

CollectionUtils.subtract(のjava.util.Collection、のjava.util.Collection b)は

はあなたの要素のうちの1つを排除してきたので、私はあなたが範囲の問題を取得する推測しています内部ループが探しているものを変更します(この問題は、通常のリストとコレクションを扱うときに発生します)。

これを回避するために過去にやったことは、削除する必要のあるアイテム(元のリストにあるもの)のリストを作成することです。その新しいリストを反復し、イテレータを移動させることなく元のリストの要素を直接削除します。インデックスを使用してminusArrayを横断

6

は、これを行うための一つの方法ですが、私はあなたが、その後array2の特定の要素のためのremove(Object)を使用できるようになりますcontains(Object)方法、を利用することが示唆されました。もちろん

は、常にありますあなたが必要なほとんどすべてを行いremoveAll(Collection) ...

+0

+1これを行うための "通常の"方法です。 –

4
あなたはorg.apache.commons.collections.ListUtilsを使用して= 1行だけあなたが望むすべてのものにすることができ

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]" 
関連する問題