Подтвердить что ты не робот

Найти наибольшее число в HashSet/HashMap java

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

4b9b3361

Ответ 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();
}