1

double の 2 つの ArrayList を取り、set2 にない set1 のすべての値を返すメソッドを作成しようとしています。これらの数値は set3 で返される必要があります。メモリ不足エラーが発生し続けます。誰かが私を正しい方向に向けることができますか?

ArrayList<Double> setDiff(ArrayList<Double> set1, ArrayList<Double> set2){
    ArrayList<Double> set3 = new ArrayList<Double>();
    int count = 0;
    while(count < set1.size()){
        boolean inList = false;
        while(inList == false){
            int count2 = 0;
            while(count2 < set2.size() && set1.get(count) == set2.get(count2)){
                count2++;
            }
            if(count2 != set2.size()){
                set3.add(set1.get(count));
            }
            else{
                inList = true;
                count++;
            }
        }
    }

    return set3;
}
4

3 に答える 3

2

Collection utils Disjunction の使用をお勧めします

指定されたコレクションの排他的論理和 (対称差) を含むコレクションを返します。

返された Collection の各要素 e のカーディナリティは、max(cardinality(e,a),cardinality(e,b)) - min(cardinality(e,a),cardinality(e,b)) と等しくなります。

これは、subtract(union(a,b),intersection(a,b)) または union(subtract(a,b),subtract(b,a)) と同等です。

于 2013-01-31T22:00:44.947 に答える
2

一部のループは、期待どおりに停止しない可能性があります。

次のコード スニペットは、実行しようとしているのとほとんど同じことを実現します。

for (Double d : set1) {
    if (!set2.contains(d)) {
        set3.add(d);
    }
}

更新:contains()を使用できないと言うので、自分でチェックを実行できます:

for (Double d : set1) {
        boolean found = false;
        for (int i=0; i<set2.size() && !found; i++) {
                if (d.equals(set2.get(i))) {
                    found = true;
            }
        }
        if (!found) {
            set3.add(d);
        }
}

編集:さらに、コードの問題は次の行にあります

  if(count2 != set2.size()){

!= を > で変更する必要があります。count2 が set2 より小さい場合、外部の count 変数が増加せず、無限ループになり、数秒後に OutOfMemoryError が発生するためです。

また、2 番目のリストのループが一貫していなかったため、アルゴリズムも 100% 正しくありませんでした。以下の while ループで同様のアプローチを見ることができます。

                int count = 0;
                while (count < set1.size()) {
                    boolean inList = false;
                    int count2 = 0;
                    while (inList == false && count2 < set2.size()) {
                        if (set1.get(count).equals(set2.get(count2))) {
                            inList = true;
                        }
                        count2++;
                    }
                    if (!inList) {
                            set3.add(set1.get(count));
                    }
                    count++;
               }
于 2013-01-31T22:01:55.203 に答える
2

これらの比較を行う前にリストを並べ替えると、アイテムの検索がはるかに効率的に実行できるため、有利な場合があります。

これを試すこともできます:

set1.removeAll(set2)

set1 に残っているアイテムは、set2 にないアイテムでした

于 2013-01-31T22:02:13.700 に答える