我有以下Node类
Class Node {
private int id;
public int getId() {
return this.id;
}
}
Run Code Online (Sandbox Code Playgroud)
然后使用节点创建一个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;
}
}
Run Code Online (Sandbox Code Playgroud)
Deb*_*sis 11
编辑:这里提出的解决方案是对数(与最佳投票答案不同),因此当树集中的节点数量很大时,它会快得多.
有没有GET的方法设置界面,类TreeSet的工具.请记住,树集的元素之间存在完整的排序,三行黑客如下:
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;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
这个问题发生在这里:
while(iterator.hasNext()) {
if(iterator.next().getId() == id)
return iterator.next();
}
Run Code Online (Sandbox Code Playgroud)
你iterator.next在同一个循环中调用两次来解释"下一个到下一个"的问题.
使局部变量仍然达到相同的元素或更好:如果你有jdk> = 5,使用for循环:
for(Node node: set) {
if(node.getId() == id)
return node;
}
Run Code Online (Sandbox Code Playgroud)
正如@JB Nizet在上面的评论中所建议的,一个简单的Map已经实现了你的代码逻辑本质,因此比TreeSet手动检查更合适.
更确切地说,TreeMap排序在Nodes上是相关的.(因为它听起来你需要订单方面)
| 归档时间: |
|
| 查看次数: |
17703 次 |
| 最近记录: |