在TreeSet中有一个名为contains的方法,如果元素在集合中,则返回true。我假设此方法使用二进制搜索,并不按升序迭代所有元素。我对吗?
我有一个TreeSet,它包含一个类的对象,该类使用两个String实例变量来区分它与同一个类的其他对象。我希望能够通过比较两个实例变量(当然使用get方法)和另外两个String变量来创建一个搜索TreeSet的方法,如果它们相等,则返回该元素。如果实例变量少于转到右子树中的第一个元素,或者如果它们在左子树中搜索更大等等。有没有办法做到这一点?
我知道我可以将对象存储在ArrayList中并使用二进制搜索来查找对象,但这不会像搜索TreeSet那么快。
答案 0 :(得分:14)
set.tailSet(obj).first();
做你想做的事。
答案 1 :(得分:6)
您可以将对象存储在TreeSet
或TreeMap<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()进行二进制搜索,尽管你不需要知道这些细节