2013-07-07 105 views
3

假设我有一个(排序的)集合,可以是List,Map,Set或其他任何东西。什么是最好的解决方案,以获得一定范围内的所有值。Java:获取集合范围内的值

例如我有整数列表如下所示:[1,5,7,9,12,30,50,100]

我想检索8个+ - 5个值,这是将成为:[5,7,9,12]

我知道NavigableMap这非常有趣,但我只能使用它检索一个元素。

对于比O(N),O(NLogN)或我可以使用的特定集合更好的算法,您有任何提示吗?

非常感谢! COSTI

回答

8

最接近你正在寻找的是一个NavigableSet,它具有following method

NavigableSet<E> subSet(E fromElement, 
        boolean fromInclusive, 
        E toElement, 
        boolean toInclusive) 

如果你有一个排序的列表,然后使用Collections.binarySearch()两次将允许您快速查找索引该范围中的第一个和最后一个元素。

此外,请注意,如果您需要的是地图,NavigableMap有一个similar method

+1

今天,我学到了一些东西:-) – Tarik

+0

“使用Collections.binarySearch()两次”每次运行都做了什么?当我们这样做? – hexafraction

+0

第一个查找范围开始的索引,第二个查找范围结束的索引。一旦你有了这两个索引,就可以使用subList()来获取范围内的所有元素。但这更复杂,因为binarySearch有时会返回负值,并且在存在重复值时不提供保证,因此您需要一些代码才能使其正确工作。 –

0

如果您有一个排序数组,则可以二进制搜索范围的最小值,然后在O(log(n))中查找范围的最大值。