2016-05-20 3 views
-2

Мне нужно найти минимальные значения на карте. Как я могу сделать? Я не могу использовать какую-либо структуру данных, и мне нужно сделать это в O (n) времени. Этот код не work..but может быть аа отправной точкой я не могу использовать Java 8.Найти минимальное значение на карте java

Entry<K, V> min=null; 
    for (Entry<K, V> entry : M.entries()) { 
     min=entry; 
     if(c.compare(min.getValue(),entry.getValue())>0){ 
      min=entry; 
     } 
     System.out.println("MIN "+min); 
    } 
+2

Пройдите по этой ссылке http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-how-do-i-fix-it – Tunaki

ответ

1

Простое решение java8 для карты Map<Object,Integer> map = new HashMap<>();

map.values().stream().min(Integer::compare).get(); 

Редактировать Как отметил @Andreas out был запрос на использование компаратора, поэтому это решение для Java 8, которое находит наименьшее значение

public static <K, V> V min8(Map<K, V> map, Comparator<V> comp) { 
    return map.values().stream().min(comp).get(); 
} 

и это решение для Java 7 для поиска записи с наименьшим значением

public static <K, V> Entry<K, V> min(Map<K, V> map, Comparator<V> comp) { 
     Iterator<Entry<K, V>> entries = map.entrySet().iterator(); 
     if (!entries.hasNext()) { 
      return null; 
     } 
     Entry<K, V> min; 
     for (min = entries.next(); entries.hasNext();) { 
      Entry<K, V> value = entries.next(); 
      if (comp.compare(value.getValue(), min.getValue()) < 0) { 
       min = value; 
      } 
     } 
     return min; 
    } 

мое первоначальное решение было очень близко к @Andreas, поэтому я решил изменить и использовать цикл с itterator.

+0

Я не могу использовать java 8 –

+2

@FilomenaDelSorbo Это было бы релевантной информацией в вопросе, не так ли? – Andreas

+0

В обоих вариантах предполагается, что значение представляет собой «Целое число». Тот факт, что вопрос использует «Компаратор» (переменная 'c'), указывает на другое. Кроме того, вопрос, похоже, требует минимального значения «Ввод» (значение «ключ +»), а не только минимальное значение. – Andreas

0

Если вы всегда задавали min = entry в начале цикла, вы всегда сравниваете запись с самим собой. Удалить эту линию, а затем также защиты от начального значения нулевой из min, и вы получите:

Entry<K, V> min = null; 
for (Entry<K, V> entry : M.entries()) { 
    if (min == null || c.compare(min.getValue(), entry.getValue()) > 0) { 
     min = entry; 
    } 
} 

Если вам нужно только значение, а не ключ тоже, а затем использовать values() вызов итерацию:

V min = null; 
for (V value : M.values()) { 
    if (min == null || c.compare(min, value) > 0) { 
     min = entry; 
    } 
} 

Конечно, в обоих случаях предположил, что не имеет значения на Карте. Нулевое значение вызывает NullPointerException, если только Comparator не сможет их обработать.