这个问题让我发疯了。我有vectorA(float),vectorB(string1),vectorC(string2)这是并行的,我想消除vectorA中的重复,而我设法保留 向量之间的并行性。 有什么想法吗?
答案 0 :(得分: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
之后的所有元素(或将它们全部复制到新数组中)。
答案 1 :(得分: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]);
}
回头很重要,因为否则你的索引就会失去同步。
答案 2 :(得分:1)
创建一个结合了三个值并覆盖equals
和hashCode
的类。将这些实例添加到单个列表而不是三个并行列表中。准备好删除重复项后(假设您需要先将它们保留在一起并稍后删除它们),请将它们添加到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));
}