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

JAVA在树映射中查找重复值并获取相同元素的键,java,collections,map,treemap,Java,Collections,Map,Treemap,我试图在论坛上搜索答案,但找不到解决问题的方法。我有表示多边形的树形图。我的第一个任务是返回具有特定值的元素的键,第二个任务是返回所有重复的顶点。以下是我尝试实现的代码和方法: private SortedMap<String, Vertex2D> vertices = new TreeMap<String, Vertex2D>(); //adds vertex to map public void addVertex(String label, Vertex2D ve

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

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;
}

我感谢你的帮助

创建第二个树状图或哈希图怎么样

HashMap<Vertex2D, ArrayList<String>>
然后迭代上面示例中的第一个树状图,检查每个元素是否已经有一个条目,如果有,只需将键添加到此字符串条目列表中

最后,您迭代这个映射,并检查每个条目列表是否有多个条目,如果是这样的话,您有一个重复的条目,并对其执行任何您想执行的操作

可能还有其他方法可以获得更好的性能,但这种方法会起作用


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

使用哈希集可以更快地找到重复项。您必须知道,方法contains在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;
}

你能告诉我们什么不起作用,你期望什么,你得到什么?当您调用addVertex时,最好也知道您将什么作为标签:它们是否是唯一的值?另外,当您编写ifentry.getValue==vert时,您的真正意思是==,而不是.equals吗?第一个是对象引用比较,第二个是对象相等。除了您遇到的问题之外,您的实现效率不高。您不应该在所有垂直面上循环两次平方以查找重复项。这是一场复杂的比赛,而你本可以继续比赛的。但这是另一个问题。是的,我意识到我的描述不对。Equals是个问题,我不是一个好程序员:顺便说一句,我不知道如何使方法更有效。我很感激任何想法,我终于发现了我的代码不起作用的原因。问题是我在这两种方法中都使用了==对方程。我应该使用我在Vertex2D类中实现的equals。愚蠢的我:哦,好吧,那样的话就用你的版本吧