我想知道有什么更好的方法可以在大型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;
}
}
答案 0 :(得分:7)
一切都在文档中:
所以,
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;
}