在保持并行列表同步的同时删除重复项

时间:2012-05-19 20:48:07

标签: java vector

这个问题让我发疯了。我有vectorA(float),vectorB(string1),vectorC(string2)这是并行的,我想消除vectorA中的重复,而我设法保留 向量之间的并行性。 有什么想法吗?

3 个答案:

答案 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)

创建一个结合了三个值并覆盖equalshashCode的类。将这些实例添加到单个列表而不是三个并行列表中。准备好删除重复项后(假设您需要先将它们保留在一起并稍后删除它们),请将它们添加到LinkedHashSet并返回ArrayListLinkedHashSet会在删除重复项时保持插入顺序(如果这不重要,请使用标准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));
}