1

この問題は私を夢中にさせます。私は vectorA(float),vectorB(string1),vectorC(string2) を持っていますが、これらは並列であり、ベクトル間の並列性を維持しながら、 vectorA の重複を排除したいと考えています。何か案は?

4

3 に答える 3

2

シングルパスのインプレースアルゴリズムは次のとおりです。

Set<Float> seen = new HashSet<Float>();
int uniques = 0;
for (int i = 0; i < n; i++) {
  if (seen.add(vectorA[i])) {
    vectorA[uniques] = vectorA[i];
    vectorB[uniques] = vectorB[i];
    vectorC[uniques] = vectorC[i];
    uniques++;
  }
}

完了したら、配置後のすべての要素を無視しますuniques(またはすべてを新しい配列にコピーします)。

于 2012-05-19T20:56:28.437 に答える
1

set<float>見たアイテムの を作成し、vectorA記録されている重複インデックスをスキャンしてから、重複としてマークしたインデックスを削除し、ベクトルの最後から開始します。

Set<Float> seen = new HashSet<Float>();
List<Integer> del = new List<Integer>();
for (int i = 0 ; i != vectorA.size() ; i++) {
    if (seen.add(vectorA[i])) {
        del.add(i);
    }
}
for (int i = del.size()-1 ; i >= 0 ; i--) {
    vectorA.remove(del[i]);
    vectorB.remove(del[i]);
    vectorC.remove(del[i]);
}

そうしないと、インデックスが同期しなくなるため、戻ることが重要です。

于 2012-05-19T20:53:36.723 に答える
1

3 つの値とオーバーライドequalsとを組み合わせたクラスを作成しますhashCode。これらのインスタンスを 3 つの並列リストではなく、1 つのリストに追加します。重複を削除する準備ができたら (最初にそれらを保持し、後で削除する必要があると仮定して)、それらを に追加し、LinkedHashSetに戻しArrayListます。重複を削除しながらLinkedHashSet挿入順序を維持します(重要でない場合は標準を使用します)。HashSet

class Triple {
    float num;
    String a;
    String b;

    public boolean equals(Object o) {
        if (o == null || !(o instanceof Triple))
            return false;
        return num == ((Triple)o).num;  // strict equality
    }

    public int hashCode() {
        return Float.floatToRawIntBits(num);
    }
}

List<Triple> removeDuplicates(List<Triple> items) {
    return new ArrayList<Triple>(new LinkedHashSet<Triple>(items));
}
于 2012-05-19T20:53:36.833 に答える