我有以下Node Class
Class Node {
private int id;
public int getId() {
return this.id;
}
}
然后使用节点创建一个TreeSet。接下来我想找到并返回一个基于id匹配的Node对象。但是,每次findNode()函数返回下一个节点而不是下一个节点时。我理解这是因为调用了iterator.next()两次。如何只调用一次来检查id值以及返回对象引用。我也试过创建一个临时的Object引用,但同样的结果也是如此。
Class NodeSet {
Set<Node> set = new TreeSet<Node>();
public Node findNode(int id) {
Iterator<Node> iterator = set.iterator();
while(iterator.hasNext()) {
if(iterator.next().getId() == id)
return iterator.next();
}
return null;
}
}
答案 0 :(得分:11)
编辑:这里提出的解决方案是对数(与最佳投票答案不同),因此当树集中的节点数量很大时,它会快得多。
类 TreeSet 实现的 Set 接口中没有 get 方法。请记住,树集的元素之间存在完整的排序,三行黑客如下:
Object search(TreeSet treeset, Object key) {
Object ceil = treeset.ceiling(key); // least elt >= key
Object floor = treeset.floor(key); // highest elt <= key
return ceil == floor? ceil : null;
}
答案 1 :(得分:8)
Class NodeSet {
Set<Node> set = new TreeSet<Node>();
public Node findNode(int id) {
Iterator<Node> iterator = set.iterator();
while(iterator.hasNext()) {
Node node = iterator.next();
if(node.getId() == id)
return node;
}
return null;
}
}
答案 2 :(得分:5)
问题出现在这里:
while(iterator.hasNext()) {
if(iterator.next().getId() == id)
return iterator.next();
}
你在同一个循环中调用两次iterator.next
来解释“下一个下一个”问题。
使局部变量仍然达到相同或更好的元素:如果你有jdk&gt; = 5,则使用for循环:
for(Node node: set) {
if(node.getId() == id)
return node;
}
正如@JB Nizet在上面的评论中所建议的那样,一个简单的Map
已经从本质上实现了你的代码逻辑,因此比TreeSet
和手动检查更合适。
更确切地说,在TreeMap
上排序的Node
是相关的。 (因为它听起来你需要订单方面)