Нахождение первого значения больше, чем в SortedMap - PullRequest
3 голосов
/ 18 сентября 2010

Я хотел бы знать, что есть лучший способ найти первое значение больше, чем введенное значение в большой SortedMap, вместо циклического перебора всех значений в моем примере ниже.Или, если SortedMap является лучшей структурой для этого.

Может ли это быть достигнуто с помощью Google-коллекций?Заранее спасибо

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 ]

7 голосов
/ 18 сентября 2010

Это все в документах:

floorKey (клавиша K)
Возвращает наименьший ключ, больший или равный данному ключу, или ноль, если такого ключа нет.

Итак,

findFirstValueGreaterThan(sortedMap, 28d)

должно быть

sortedMap.ceilingKey(28d)

Обратите внимание на разницу между «больше чем» и «больше или равно», хотя.

2 голосов
/ 18 сентября 2010

Для этого решения требуется только 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;
}
...