我试图搜索论坛寻找答案,但我无法找到问题的解决方案。我有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;
}
我感谢你的每一次帮助!
答案 0 :(得分:0)
如何创建第二个TreeMap或HashMap
HashMap<Vertex2D, ArrayList<String>>
然后在上面的示例中迭代第一个TreeMap,并为每个元素检查是否已经有一个条目,如果是,只需将密钥添加到此条目字符串列表中。
最后,你遍历这个地图,并检查每个条目列表是否有多个条目,如果是这种情况你有重复(并做任何你想做的事情)。
可能还有其他方法可以提高性能,但这种方式可行。
答案 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;
}