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



这个问题让我发疯。我有矢量A(浮点数(,矢量B(字符串1(,矢量C(字符串2(,它们是并行的,我想消除矢量A中的重复项,同时我设法保留向量之间的并行性。有什么想法吗?

下面是一个单通道的就地算法:

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后的所有元素(或将它们全部复制到新数组中(。

为您看到的项目创建一个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]);
}

返回很重要,否则索引将不同步。

创建一个组合三个值并覆盖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));
}

最新更新