查找大于SortedMap中的第一个值

时间:2010-09-18 03:42:03

标签: java guava sortedmap

我想知道有什么更好的方法可以在大型SortedMap中找到大于输入值的第一个值,而不是在下面的示例中循环遍历所有值。或者,如果SortedMap是用于此的最佳结构。

这可以通过google-collections实现吗? 提前致谢

public class mapTest {
public static void main(String[] args) {

SortedMap<Double, Object> sortedMap = new TreeMap<Double, Object>();
    sortedMap.put(30d, "lala");     
    sortedMap.put(10d, "foo");
    sortedMap.put(25d, "bar");
    System.out.println("result: " + findFirstValueGreaterThan(sortedMap, 28d));
}

public static Object findFirstValueGreaterThan(SortedMap<Double, Object> sortedMap, Double value) {
    for (Entry<Double, Object> entry : sortedMap.entrySet()) {
        if (entry.getKey() > value) {
            // return first value with a key greater than the inputted value
            return entry.getValue();
        }
    }
    return null;
}
}

2 个答案:

答案 0 :(得分:7)

一切都在文档中:

ceilingKey(K key)
Returns the least key greater than or equal to the given key, or null if there is no such key.

所以,

findFirstValueGreaterThan(sortedMap, 28d)

应该是

sortedMap.ceilingKey(28d)

注意“大于”和“大于或等于”之间的差异。

答案 1 :(得分:2)

此解决方案仅需要SortedMap。请注意,tailMap通常不会创建新地图,所以它很快。

public static <K extends Comparable<K>, V> V
        findFirstValueGreaterThan(SortedMap<K, V> map, K value) {
    Iterator<Entry<K, V>> it = map.tailMap(value).entrySet().iterator();
    if (it.hasNext()) {
        Entry<K, V> e = it.next();
        if (e.getKey().compareTo(value) > 0) {
            return e.getValue();
        } else if (it.hasNext()) {
            return it.next().getValue();
        }
    }
    return null;
}