5

我有以下节点类

Class Node {
    private int id;

    public int getId() {
        return this.id;
    }
}

然后用节点创建一个 TreeSet。接下来我想根据 id 匹配找到并返回一个 Node 对象。但是,每次 findNode() 函数都返回下一个节点而不是下一个节点。我知道这是因为调用了 iterator.next() 两次。如何只调用一次以检查 id 值并返回对象引用。我也尝试过创建一个临时对象引用,但结果还是一样。

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;                
    }
}
4

3 回答 3

19

编辑:这里提出的解决方案是对数的(与公认的答案不同),因此当树集中的节点数量很大时要快得多。

TreeSet类实现的Set接口中没有get方法。请记住,treeset 的元素之间存在完整的排序,三行hack如下:

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; 
}
于 2014-09-18T23:03:31.927 回答
9
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;                
    }
}
于 2013-07-23T09:37:22.377 回答
5

问题发生在这里:

        while(iterator.hasNext()) {
            if(iterator.next().getId() == id)               
                return iterator.next();
        }

iterator.next您在同一个循环中调用了两次来解释“下一个到下一个”问题。

使局部变量仍能到达相同或更好的元素:如果 jdk >= 5,请使用 for 循环:

for(Node node: set) {
   if(node.getId() == id) 
     return node;
}

正如@JB Nizet 在上面的评论中所建议的那样,一个简单的Map已经从本质上实现了您的代码逻辑,因此比TreeSet手动检查更适合。
更准确地说,TreeMap对 s 进行排序Node是相关的。(因为听起来你需要订单方面)

于 2013-07-23T09:38:49.980 回答