2013-02-12 3 views
18

Я хотел бы найти наибольшее количество в HashSet и HashMap. Скажем, у меня есть номер [22,6763,32,42,33] в моем HashSet, и я хочу найти наибольшее число в моем текущем HashSet. Как бы я это сделал? и то же самое для HashMap. Надеюсь, ты сможешь мне помочь. Спасибо.Найти наибольшее количество в HashSet/HashMap java

+4

Если вам нужно сделать это, вы, вероятно, не следует использовать хэш на основе коллекции. –

ответ

54

Вы можете использовать Collections.max(Collection), чтобы найти максимальный элемент из любой коллекции. Аналогичным образом, для HashMap, вы можете использовать тот же метод на своих keySet() или values(), в зависимости от того, хотите ли вы максимальный ключ или максимальное значение.

Кроме того, если вы хотите как таковое, вы можете вместо этого использовать TreeSet и TreeMap, который хранит элементы в отсортированном порядке ключей.

+2

+1 короткий и точный –

+0

Ничего себе. Спасибо .. это помогает. :) – user2064467

+0

@ user2064467. Добро пожаловать :) –

6

Если вы вынуждены использовать HashSet/HashMap, то вы должны сканировать весь HashSet/HashMap для того, чтобы найти максимум. Библиотечные функции, такие как Collections.max(), будут делать это.

Если вы хотите O(1) извлечения максимума, и вы имеете право изменить тип коллекции используются, используйте отсортированный набор/карту (например TreeSet/TreeMap).

+0

O (1) работает только на картах; для значений сначала должен быть создан отдельный сбор, так что снова O (n) с очень плохим постоянным коэффициентом. –

+0

Также обратите внимание, что TreeSet становится дороже для вставки и удаления. Так мудро выбрать правильную реализацию –

2

Что-то вроде этого:

Set<Integer> values = new HashSet<Integer>() {{ 
    add(22); 
    add(6763); 
    add(32); 
    add(42); 
    add(33); 
}}; 
int maxValue = Integer.MIN_VALUE; 
for (int value : values) { 
    if (value > maxValue) { 
     maxValue = value; 
    } 
} 

И это:

Map<String, Integer> values = new HashMap<String, Integer>() {{ 
    put("0", 22); 
    put("1", 6763); 
    put("2", 32); 
    put("3", 42); 
    put("4", 33); 
}}; 
int maxValue = Integer.MIN_VALUE; 
for (int value : values.values()) { 
    if (value > maxValue) { 
     maxValue = value; 
    } 
} 
+0

Ужасный способ инициализации HashMap только для этой простой цели должен быть создан новый класс. Я ненавижу это каждый раз, когда вижу это в коде, с которым я работаю. – Kamil

+1

Что такого ужасного? Я не вижу в этом никакого вреда. – duffymo

+0

Что я написал выше, он создает новый класс только для создания карты с несколькими элементами. Это очень медленно (есть тесты на Stackoverflow). – Kamil

7

попробовать

int max = Collections.max(set); 
    int maxKey = Collections.max(map.keySet()); 
    int maxValue Collections.max(map.values()); 
0

В случае TreeMap, если вы знаете, что ключ/значения вставляются случайным образом, то дерево будет более или менее сбалансированным. Деревья становятся несбалансированными, если данные вставляются в уже отсортированный порядок, возможность быстрого поиска (или вставки или удаления) данного элемента теряется. В случае несбалансированного дерева это займет время, пропорциональное n, O (n) else O (1).

0

Рассмотрите возможность использования Apache Commons Math. Вот API docs.
Класс интереса SummaryStatistics. Он работает с double s и вычисляет max, min, mean и т. Д. На лету (как вы добавляете к нему значения). Значения данных не сохраняются в памяти, поэтому этот класс может использоваться для вычисления статистики для очень больших потоков данных.

0

Вот простой метод, который делает то, что вы спрашиваете:

public String getMapKeyWithHighestValue(HashMap<String, Integer> map) { 
    String keyWithHighestVal = ""; 

    // getting the maximum value in the Hashmap 
    int maxValueInMap = (Collections.max(map.values())); 

    //iterate through the map to get the key that corresponds to the maximum value in the Hashmap 
    for (Map.Entry<String, Integer> entry : map.entrySet()) { // Iterate through hashmap 
     if (entry.getValue() == maxValueInMap) { 

      keyWithHighestVal = entry.getKey();  // this is the key which has the max value 
     } 

    } 
    return keyWithHighestVal; 
}