1

这个问题让我发疯。我有 vectorA(float),vectorB(string1),vectorC(string2) 是并行的,我想消除 vectorA 中的重复项,同时我设法保持向量之间的并行性。有任何想法吗?

4

3 回答 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 回答