web-dev-qa-db-de.com

Finden Sie die größte Zahl in HashSet/HashMap Java

Ich würde gerne die größte Anzahl in HashSet und HashMap finden. Angenommen, ich habe die Nummer [22,6763,32,42,33] in meinem HashSet, und ich möchte die größte Nummer in meinem aktuellen HashSet finden. und dasselbe auch für die HashMap. Ich hoffe du kannst mir dabei helfen. Vielen Dank. 

19
user2064467

Sie können Collections.max(Collection) verwenden, um das maximale Element aus einer Sammlung herauszufinden Ebenso können Sie für eine HashMap dieselbe Methode für ihre keySet() oder values() verwenden. , abhängig davon, ob Sie den maximalen Schlüssel oder den maximalen Wert wünschen. 

Wenn Sie möchten, können Sie stattdessen auch eine TreeSet und TreeMap verwenden, die die Elemente in sortierter Schlüsselreihenfolge speichert.

60
Rohit Jain

versuchen

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

Wenn Sie gezwungen sind, eine HashSet/HashMap zu verwenden, müssen Sie die gesamte HashSet/HashMap scannen, um das Maximum zu ermitteln. Bibliotheksfunktionen wie Collections.max() machen das so.

Wenn Sie möchten, dass O(1) das Maximum abruft und Sie den verwendeten Auflistungstyp ändern dürfen, verwenden Sie eine sortierte Menge/Karte (z. B. TreeSet/TreeMap).

6
gd1

Etwas wie das:

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;
    }
}

Und das: 

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;
    }
}
2
duffymo

Wenn Sie wissen, dass die Schlüssel/Werte zufällig in TreeMap eingefügt werden, ist der Baum mehr oder weniger ausgeglichen. Bäume werden aus dem Gleichgewicht, wenn Daten in bereits sortierter Reihenfolge eingefügt werden, geht die Fähigkeit, ein bestimmtes Element schnell zu finden (oder einzufügen oder zu löschen), verloren. Im Falle eines unsymmetrischen Baums dauert es eine Zeit proportional zu n, O(n) oder O (1).

0
Satish

Hier ist eine einfache Methode, die tut, was Sie fragen:

  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;
}
0
ctu

Erwägen Sie die Verwendung von Apache Commons Math . Hier sind die API-Dokumente .
Die interessierende Klasse ist SummaryStatistics . Es arbeitet mit doubles und berechnet Max, Min, Mittelwert usw. im laufenden Betrieb (wenn Sie Werte hinzufügen). Die Datenwerte werden nicht im Speicher abgelegt, daher kann diese Klasse zur Berechnung von Statistiken für sehr große Datenströme verwendet werden.

0
naXa

Hinweis : Wenn Sie den größten Wert von Map finden möchten, versuchen Sie es mit maxEntry.get ().

1. Stream verwenden

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. Verwenden von Collections.max () mit einem Lambda-Ausdruck

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. Stream mit Methodenreferenz verwenden

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. Verwenden von 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. Einfache Iteration verwenden

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();
}