3

我想知道有什么更好的方法可以在大型 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;
}
}
4

2 回答 2

7

这一切都在文档中:

ceilingKey(K key)
返回大于或等于给定键的最小键,如果没有这样的键,则返回 null。

所以,

findFirstValueGreaterThan(sortedMap, 28d)

应该

sortedMap.ceilingKey(28d)

不过,请注意“大于”和“大于或等于”之间的区别。

于 2010-09-18T03:54:34.057 回答
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;
}
于 2010-09-18T08:27:57.980 回答