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