使用二进制搜索从TreeSet返回元素

时间:2011-04-05 21:20:47

标签: java arraylist binary-search treeset

在TreeSet中有一个名为contains的方法,如果元素在集合中,则返回true。我假设此方法使用二进制搜索,并不按升序迭代所有元素。我对吗?

我有一个TreeSet,它包含一个类的对象,该类使用两个String实例变量来区分它与同一个类的其他对象。我希望能够通过比较两个实例变量(当然使用get方法)和另外两个String变量来创建一个搜索TreeSet的方法,如果它们相等,则返回该元素。如果实例变量少于转到右子树中的第一个元素,或者如果它们在左子树中搜索更大等等。有没有办法做到这一点?

我知道我可以将对象存储在ArrayList中并使用二进制搜索来查找对象,但这不会像搜索TreeSet那么快。

5 个答案:

答案 0 :(得分:14)

set.tailSet(obj).first();

做你想做的事。

答案 1 :(得分:6)

您可以将对象存储在TreeSetTreeMap<Foo, Foo>中(如果您每次都无法轻松创建新的实际TreeMap<FooKey, Foo>,而不是使用Foo想要搜索)。 Set并非真正用于查找。

对于FooKey示例,FooKey将是一个简单的不可变类,它只包含两个String并且是Comparable。找到两个Foo的{​​{1}}的值将是String的简单问题。这当然使用你想要找到值的树遍历。

答案 2 :(得分:2)

您应该在对象上实现Comparable,或者在构造TreeSet时创建一个单独的Comparator类。这允许您插入自定义条目比较逻辑,并让TreeSet执行其优化的存储/搜索事物。

答案 3 :(得分:1)

我想知道的一件事是你想要搜索一个有序集合?如果您希望能够按顺序迭代以及快速查找,则可以将对象存储在两个单独的数据结构中。一个类似于您的SortedSet<Foo>,然后还有HashMap<FooKey,Foo>类似于ColinD提到的内容。然后在TreeMap上获得常量时间查找而不是log(n)。您必须写入两个结构的写入惩罚,以及具有两个数据结构的内存资源损失,但您已完全优化了对数据的访问。

此外,如果内存资源受到约束,并且您的字符串实际上是区分对象的,那么您只需在对象hashcode()上实现equals()Foo,然后将它们用作关键和价值(例如HashMap<Foo,Foo>。警告说,你必须构建一个Foo来调用getter。

答案 4 :(得分:0)

你得到了关于使用可比较/比较器的答案,但我想我会补充说你是对的,contains()进行二进制搜索,尽管你不需要知道这些细节