2016-03-14 13 views
5

Was ist der beste/effizienteste Weg, um die Gesamtzahl der Werte in einem HashMap zu finden.Anzahl der Werte in einer HashMap finden?

Ich meine nicht die .size() Methode, wie es die Anzahl der Schlüssel zählt. Ich möchte die Gesamtzahl der Werte in allen Schlüsseln.

Ich möchte als mein Schlüssel ist ein String, aber mein Wert ist ein List.

+1

Da es in einer Java-Map eine 1: 1-Beziehung zwischen * key * und * value * gibt, sollten Sie vielleicht erklären, warum die Methode '.size()' nicht ausreicht. –

+1

Die Anzahl der Werte in einer Map entspricht jedoch der Anzahl der Schlüssel in dieser Map. Welcher Typ sind diese Werte? – dinomario10

+0

Bitte beachten Sie meine Bearbeitung über, die Werte sind eine Liste – java123999

Antwort

7

Einfachste wäre, iterieren und Liste hinzufügen über Größen.

int total = 0; 
for (List<Foo> l : map.values()) { 
    total += l.size(); 
} 

// here is the total values size 
+0

Arbeitete wie erwartet :) – java123999

2

Sagen Sie bitte eine Karte

Map<String, List<Object>> map = new HashMap<>(); 

Sie können dies tun, indem Sie den Aufruf der values() Methode und ruft size() Methode für alle Listen haben:

int total = 0; 
Collection<List<Object>> listOfValues = map.values(); 
for (List<Object> oneList : listOfValues) { 
    total += oneList.size(); 
} 
2

Wenn ich die Frage richtig verstanden habe, haben Sie eine Map<String, List<Something>>, und Sie möchten die Gesamtzahl der Elemente in allen List s in der Map ‚s Werte zählen. Java 8 bietet eine recht einfache Möglichkeit, dies zu tun, indem sie die Werte Streaming, Kartierung sie zu ihren size() und sie dann nur Summieren:

Map<String, List<Something>> map = ...; 
int totalSize = map.values().stream().mapToInt(List::size).sum()); 
5

In Java 8 können Sie auch die Stream API nutzen:

int total = map.values() 
       .stream() 
       .mapToInt(List::size) // or (l -> l.size()) 
       .sum() 

Dies hat den Vorteil, dass Sie zu dem List<Foo> Typ für eine for Variable nicht zu wiederholen, wie in der Pre-Java 8 Lösung:

int total = 0; 
for (List<Foo> list : map.values()) 
{ 
    total += list.size(); 
} 
System.out.println(total); 

Zusätzlich zu, dass, obwohl nicht empfohlen, können Sie auch diesen Wert inline verwenden, ohne eine temporäre Variable zu benötigen:

System.out.println(map.values().stream().mapToInt(List::size).sum()); 
2

mit Java Ab 8, da einen Map<K, List<V>> map Sie den Stream-API verwenden könnten und haben:

int size = map.values().stream().mapToInt(List::size).sum(); 

Dies schafft eine Stream der Werte mit stream(), ordnet jeder von ihnen auf ihre Größe mit mapToInt, wo der Mapper ist die Methode Referenz List::size refering zu List#size(), und die Ergebnisse mit sum() summieren.

3

Mit Eclipse Collections funktioniert das Folgende unter Verwendung von MutableMap.

MutableMap<String, List<String>> map = 
     Maps.mutable.of("key1", Lists.mutable.of("a", "b", "c"), 
         "key2", Lists.mutable.of("d", "e", "f", "g")); 

long total = map.sumOfInt(List::size); 

Hinweis: Ich bin ein Committer für Eclipse Collections.

Verwandte Themen