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 に答える