Я хотел бы найти наибольшее число в HashSet и HashMap. Скажем, у меня есть номер [22,6763,32,42,33] в моем HashSet, и я хочу найти наибольшее число в моем текущем HashSet. Как бы я это сделал? и то же самое для HashMap. Надеюсь, ты сможешь мне помочь. Спасибо.
Найти наибольшее число в HashSet/HashMap java
Ответ 1
Вы можете использовать Collections.max(Collection)
, чтобы найти максимальный элемент из любой коллекции.
Аналогично, для HashMap
вы можете использовать тот же метод на keySet()
или values()
, в зависимости от того, хотите ли вы максимальный ключ или максимальное значение.
Кроме того, если вы хотите как таковой, вы можете использовать TreeSet
и TreeMap
вместо этого хранит элементы в упорядоченном порядке клавиш.
Ответ 2
попробовать
int max = Collections.max(set);
int maxKey = Collections.max(map.keySet());
int maxValue Collections.max(map.values());
Ответ 3
Если вы вынуждены использовать HashSet
/HashMap
, вам нужно отсканировать весь HashSet
/HashMap
, чтобы найти максимум. Библиотечные функции, такие как Collections.max()
, будут делать это следующим образом.
Если вы хотите O(1)
извлечь максимум, и вы можете изменить тип используемой коллекции, используйте отсортированный набор/карту (например, TreeSet
/TreeMap
).
Ответ 4
Что-то вроде этого:
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;
}
}
Ответ 5
В случае TreeMap, если вы знаете, что ключ/значения вставлены случайным образом, дерево будет более или менее сбалансированным. Деревья становятся несбалансированными, если данные вставляются в уже отсортированный порядок, возможность быстрого поиска (или вставки или удаления) данного элемента теряется. В случае несбалансированного дерева это займет время, пропорциональное n, O (n) else O (1).
Ответ 6
Рассмотрим использование Apache Commons Math. Вот API-документы.
Класс интереса SummaryStatistics. Он работает с double
и вычисляет max, min, mean и т.д. На лету (как вы добавляете к нему значения). Значения данных не сохраняются в памяти, поэтому этот класс может использоваться для вычисления статистики для очень больших потоков данных.
Ответ 7
Вот простой способ, который делает то, что вы спрашиваете:
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;
}
Ответ 8
Примечание. Если вы хотите найти наибольшее значение в Map, попробуйте maxEntry.get(). GetValue() вместо maxEntry.get(). GetKey().
1. Использование Stream
public <K, V extends Comparable<V>> V maxUsingStreamAndLambda(Map<K, V> map) {
Optional<Entry<K, V>> maxEntry = map.entrySet()
.stream()
.max((Entry<K, V> e1, Entry<K, V> e2) -> e1.getValue()
.compareTo(e2.getValue())
);
return maxEntry.get().getKey();
}
2. Использование Collections.max() с лямбда-выражением
public <K, V extends Comparable<V>> V maxUsingCollectionsMaxAndLambda(Map<K, V> map) {
Entry<K, V> maxEntry = Collections.max(map.entrySet(), (Entry<K, V> e1, Entry<K, V> e2) -> e1.getValue()
.compareTo(e2.getValue()));
return maxEntry.getKey();
}
3. Использование потока со ссылкой на метод
public <K, V extends Comparable<V>> V maxUsingStreamAndMethodReference(Map<K, V> map) {
Optional<Entry<K, V>> maxEntry = map.entrySet()
.stream()
.max(Comparator.comparing(Map.Entry::getValue));
return maxEntry.get()
.getKey();
}
4. Использование Collections.max()
public <K, V extends Comparable<V>> V maxUsingCollectionsMax(Map<K, V> map) {
Entry<K, V> maxEntry = Collections.max(map.entrySet(), new Comparator<Entry<K, V>>() {
public int compare(Entry<K, V> e1, Entry<K, V> e2) {
return e1.getValue()
.compareTo(e2.getValue());
}
});
return maxEntry.getKey();
}
5. Использование простой итерации
public <K, V extends Comparable<V>> V maxUsingIteration(Map<K, V> map) {
Map.Entry<K, V> maxEntry = null;
for (Map.Entry<K, V> entry : map.entrySet()) {
if (maxEntry == null || entry.getValue()
.compareTo(maxEntry.getValue()) > 0) {
maxEntry = entry;
}
}
return maxEntry.getKey();
}