Я хотел бы найти наибольшее количество в HashSet и HashMap. Скажем, у меня есть номер [22,6763,32,42,33] в моем HashSet, и я хочу найти наибольшее число в моем текущем HashSet. Как бы я это сделал? и то же самое для HashMap. Надеюсь, ты сможешь мне помочь. Спасибо.Найти наибольшее количество в HashSet/HashMap java
ответ
Вы можете использовать Collections.max(Collection)
, чтобы найти максимальный элемент из любой коллекции. Аналогичным образом, для HashMap
, вы можете использовать тот же метод на своих keySet()
или values()
, в зависимости от того, хотите ли вы максимальный ключ или максимальное значение.
Кроме того, если вы хотите как таковое, вы можете вместо этого использовать TreeSet
и TreeMap
, который хранит элементы в отсортированном порядке ключей.
+1 короткий и точный –
Ничего себе. Спасибо .. это помогает. :) – user2064467
@ user2064467. Добро пожаловать :) –
Если вы вынуждены использовать HashSet
/HashMap
, то вы должны сканировать весь HashSet
/HashMap
для того, чтобы найти максимум. Библиотечные функции, такие как Collections.max()
, будут делать это.
Если вы хотите O(1)
извлечения максимума, и вы имеете право изменить тип коллекции используются, используйте отсортированный набор/карту (например TreeSet
/TreeMap
).
O (1) работает только на картах; для значений сначала должен быть создан отдельный сбор, так что снова O (n) с очень плохим постоянным коэффициентом. –
Также обратите внимание, что TreeSet становится дороже для вставки и удаления. Так мудро выбрать правильную реализацию –
Что-то вроде этого:
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;
}
}
Ужасный способ инициализации HashMap только для этой простой цели должен быть создан новый класс. Я ненавижу это каждый раз, когда вижу это в коде, с которым я работаю. – Kamil
Что такого ужасного? Я не вижу в этом никакого вреда. – duffymo
Что я написал выше, он создает новый класс только для создания карты с несколькими элементами. Это очень медленно (есть тесты на Stackoverflow). – Kamil
попробовать
int max = Collections.max(set);
int maxKey = Collections.max(map.keySet());
int maxValue Collections.max(map.values());
В случае TreeMap, если вы знаете, что ключ/значения вставляются случайным образом, то дерево будет более или менее сбалансированным. Деревья становятся несбалансированными, если данные вставляются в уже отсортированный порядок, возможность быстрого поиска (или вставки или удаления) данного элемента теряется. В случае несбалансированного дерева это займет время, пропорциональное n, O (n) else O (1).
Рассмотрите возможность использования Apache Commons Math. Вот API docs.
Класс интереса SummaryStatistics. Он работает с double
s и вычисляет max, min, mean и т. Д. На лету (как вы добавляете к нему значения). Значения данных не сохраняются в памяти, поэтому этот класс может использоваться для вычисления статистики для очень больших потоков данных.
Вот простой метод, который делает то, что вы спрашиваете:
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;
}
Если вам нужно сделать это, вы, вероятно, не следует использовать хэш на основе коллекции. –