这个问题让我发疯。我有 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
创建一个组合三个值并覆盖equals
和的类hashCode
。将这些实例添加到单个列表而不是三个并行列表中。一旦您准备好删除重复项(假设您需要先保留它们并在以后删除它们),将它们添加到 aLinkedHashSet
并返回到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 回答