2010-09-18 7 views
3

Я хотел бы знать, что есть лучший способ найти первое значение больше, чем введенное значение в большой SortedMap, а не перебирать все значения в моем примере ниже. Или если 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; 
} 
} 

ответ

6

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

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) 

Pay внимание при разнице между «больше чем» и «больше или равно».

+0

строго говоря, 'ceilingKey' и подобные методы находятся в интерфейсе' NavigableMap', а не в интерфейсе 'SortedMap'. –

+0

@ Stephen Спасибо, мой плохой. Я оставлю ответ, так как TreeMap упоминается в вопросе (и все стандартные реализации SortedMap также являются реализациями NavigableMap). –

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; 
} 
+1

спасибо thomas, ceilingKey выглядит лучше подходит для моего использования. – patrickandroid

+0

Конечно. Я просто подумал, есть ли способ ... –