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

Joa*_*mal 2 java

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

  • 是的,我认为这是正确的.我还说,实际上最好只使用`floor`和`compareTo`来保存两次搜索.除此之外,这是建议采用对数时间解决方案的唯一答案,因此它得到了我的投票. (3认同)

Red*_*ddy 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;                
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这个查找算法使用线性搜索 - 使用`TreeSet`的优点是搜索可以在对数时间内完成!您可能想要使用`TreeMap`. (4认同)

Mik*_*378 5

这个问题发生在这里:

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