【发布时间】:2014-12-06 13:42:58
【问题描述】:
我尝试在论坛中搜索答案,但找不到问题的解决方案。我有代表多边形的 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;
}
感谢每一个帮助!
【问题讨论】:
-
您能告诉我们什么不完全正常,您期望什么以及您得到什么?很高兴知道当您调用“addVertex”时您将什么作为“标签”:它们是否是唯一值?另外,当你写“if(entry.getValue() == vert)”时,你真的是指“==”,而不是“.equals()”吗?第一个是对象引用比较,第二个是对象相等。
-
除了您遇到的问题之外,您的实施效率不高。您不应在所有顶点上循环两次(平方)以查找重复项。它的复杂度是 o(n²),而你可以有 o(n)。但这是另一个问题
-
是的,我意识到我的描述不正确。 Equals() 是问题所在,我不是优秀的程序员:D(顺便说一句,我不知道如何使方法 duplicateVertices 更有效。我很欣赏任何想法)
标签: java collections map treemap