在Java中查找并返回TreeSet中的元素

时间:2013-07-23 09:35:45

标签: java

我有以下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;                
    }
}

3 个答案:

答案 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是相关的。 (因为它听起来你需要订单方面)