JAVA在TreeMap中查找重复值并获取相同元素的键

时间:2014-12-06 13:42:59

标签: java collections map treemap

我试图搜索论坛寻找答案,但我无法找到问题的解决方案。我有TreeMap代表多边形。我的第一个任务是返回具有特定值的元素的键,第二个任务是返回所有重复的顶点。这是我试图实现的代码和方法:

private SortedMap<String, Vertex2D> vertices = new TreeMap<String, Vertex2D>();

//adds vertex to map
public void addVertex(String label, Vertex2D vert){
    if(label == null){
        throw new NullPointerException("label");
    }
    if(vert == null){
        throw new NullPointerException("vert");
    }
    vertices.put(label, vert);
}

//这些方法无法正常工作

public Collection<String> getLabels(Vertex2D vert){
    SortedSet<String> labels = new TreeSet<String>();
    for(Map.Entry<String, Vertex2D> entry : vertices.entrySet()){
        if(entry.getValue() == vert) {
            labels.add(entry.getKey());
        }
    }
    return labels;
}


public Collection<Vertex2D> duplicateVertices(){
    List<Vertex2D> list = new ArrayList<Vertex2D>(vertices.values());
    List<Vertex2D> duplicated = new ArrayList<Vertex2D>();
    for(int i = 0; i < list.size() - 1; i++){
            for(int j = i+1; j < list.size() - 1; j++){
                if(!duplicated.contains(list.get(j)) && list.get(j) == list.get(i)){
                    duplicated.add(list.get(j));
                }
            }
        }
    return duplicated;
}

我感谢你的每一次帮助!

2 个答案:

答案 0 :(得分:0)

如何创建第二个TreeMap或HashMap

HashMap<Vertex2D, ArrayList<String>>

然后在上面的示例中迭代第一个TreeMap,并为每个元素检查是否已经有一个条目,如果是,只需将密钥添加到此条目字符串列表中。

最后,你遍历这个地图,并检查每个条目列表是否有多个条目,如果是这种情况你有重复(并做任何你想做的事情)。

可能还有其他方法可以提高性能,但这种方式可行。

similar topic here

答案 1 :(得分:0)

回答效率问题,因为您已经解决了主要问题:

使用HashSet可以更快地找到重复项。您必须知道方法“包含”在HashSet上的执行速度比在ArrayList上快得多:

public Collection<Vertex2D> duplicateVertices() {
    Set<Vertex2D> singleSet = new HashSet<Vertex2D>();
    List<Vertex2D> duplicated = new ArrayList<Vertex2D>();

    for (Vertex2D vertex : vertices.values()) {
        if (!singleSet.contains(vertex)) {
            singleSet.add(vertex);
        } else {
            duplicated.add(vertex);
        }
    }
    return duplicated;
}

另一种选择是使用番石榴的HashMultiset。 “HashMultiset”与HashSet非常相似,但会保留有关出现次数的信息:

public Collection<Vertex2D> duplicateVertices() {
    HashMultiset<Vertex2D> multiset = HashMultiset.create(vertices.values());
    List<Vertex2D> duplicated = new ArrayList<Vertex2D>();

    for (Multiset.Entry<Vertex2D> entry : multiset.entrySet()) {
        if (entry.getCount() > 1) {
            duplicated.add(entry.getElement());
        }
    }
    return duplicated;
}