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。愚蠢的我:哦,好吧,那样的话就用你的版本吧