Pobierz minvalue Mapy (klucz, podwójny)

Czy istnieje metoda (może z Google Collections), aby uzyskać minimalną wartość Map(Key, Double)?

W tradycyjny sposób musiałbym posortować mapę według wartości i wziąć pierwszą/ostatnią.

 20
Author: peterh, 2010-05-05

7 answers

Możesz użyć standardowego Collections#min() za to.

Map<String, Double> map = new HashMap<String, Double>();
map.put("1.1", 1.1);
map.put("0.1", 0.1);
map.put("2.1", 2.1);

Double min = Collections.min(map.values());
System.out.println(min); // 0.1

Update: skoro klucz też potrzebujesz, cóż, nie widzę sposobów w Collections lub Google Collections2 API od Map nie jest Collection. Na Maps#filterEntries() nie jest to również użyteczne, ponieważ rzeczywisty wynik iteracji znamy tylko na końcu.

Najprostszym rozwiązaniem byłoby to:

Entry<String, Double> min = null;
for (Entry<String, Double> entry : map.entrySet()) {
    if (min == null || min.getValue() > entry.getValue()) {
        min = entry;
    }
}

System.out.println(min.getKey()); // 0.1

(nullcheck on min left aside)

 38
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-05 20:17:42

Nadal możesz użyć {[2] } z niestandardowym Comparator, aby uzyskać Map.Entry z niższą wartością:

Map<String, Double> map = new HashMap<String, Double>();
map.put("1.1", 1.1);
map.put("0.1", 0.1);
map.put("2.1", 2.1);
Entry<String, Double> min = Collections.min(map.entrySet(), new Comparator<Entry<String, Double>>() {
    public int compare(Entry<String, Double> entry1, Entry<String, Double> entry2) {
        return entry1.getValue().compareTo(entry2.getValue());
    }
});
System.out.printf("%s: %f", min.getKey(), min.getValue()); // 0.1: 0.100000

Z Java 8:

Entry<String, Double> min = Collections.min(map.entrySet(),
                                       Comparator.comparing(Entry::getValue));
 14
Author: superfav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-14 19:31:40

W tradycyjny sposób, musiałbym Sortuj mapę według wartości, i weź pierwszą / ostatnią. dzięki

Nie, Nie zrobiłbyś tego. musiałbyś iterować przez wszystkie wartości i na każdym kroku porównywać bieżący element z najmniejszym widzianym do tej pory. To O(n), w porównaniu z O(N*log(n)) dla sortowania - potencjalnie Ogromna różnica.

BTW, tak właśnie działa Collections.min().

 5
Author: Michael Borgwardt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-05 19:46:02

Byłbym skłonny użyć BiMap Google Collections:

     String minKey = HashBiMap.create(map).inverse().get(Collections.min(map.values()));

Lub coś w tym stylu (nie testowane).

 2
Author: Yishai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-05 20:15:21

Używanie strumieni Java 8:

return map
            .entrySet()
            .stream()
            .sorted(Comparator.comparingDouble(Map.Entry::getValue))
            .findFirst()
            .map(Map.Entry::getValue);

Lub

return map
            .entrySet()
            .stream()
            .min(Comparator.comparingDouble(Map.Entry::getValue))
            .map(Map.Entry::getValue);

Ale jeśli chcesz zrobić to wiele razy, to zdecydowanie daj heap spojrzenie.

 2
Author: voho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-14 11:16:32

Aby zrobić to efektywnie, możesz chcieć zdefiniować własną strukturę danych, tak aby implementowała interfejs mapy, ale także pozwalała na wydajne działanie getMin ().

Można to zrobić za pomocą dwóch wewnętrznych struktur danych: mapy i drzewa (lub struktury danych sterty). Za każdym razem, gdy dodawana jest nowa para (K, V), dodawaj je do mapy, a także do drzewa (jako pojedynczy wpis). Pozwala to na czas o(1) operacji get(Key) oraz o (log n) operacji dodawania, usuwania i getMin.

 1
Author: Eyal Schneider,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-05 22:16:00

Za pomocą Javy 8 (i importu statycznego). Możemy sprawić, że rozwiązanie @ superfav będzie o wiele bardziej uporządkowane:

Map<String, Double> myMap;
String theKeyWithHighestValue = Collections.min(myMap.entrySet(), comparingDouble(Entry::getValue)).getKey()
 1
Author: Tarrasch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-16 10:24:26