2013-07-07 102 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))中查找範圍的最大值。