2014-02-23 14 views
8

Ich spiele mit Java 8 und ich weiß, dass dies möglich sein muss durch Lesen der Dokumentation, ich kann einfach nicht herausfinden, wie es geht.Konvertieren Sie die Liste <Long> zu Karte <Long, Long>, die Vorkommen

Ich habe folgende Arbeits Code:

long factorProduct = LongStream.rangeClosed(1, maxFactor) 
      .filter(this::isOptimalFactor) 
      .reduce((i, j) -> i * j) 
      .getAsLong(); 
    List<Long> primeFactors = primeFactors(factorProduct); 

Wesentlicher Teil ist, dass ich ein List<Long> dass kann haben Duplikate einige Long Zahlen auf.

Jetzt möchte ich es in eine Map<Long, Long> konvertieren mit als Schlüssel das Element und als Wert die Vorkommen. Ich

dachte, dass:

Map<Long, Long> primeFactorCount = primeFactors.stream() 
      .collect(Collectors.counting()); 

funktionieren würde, aber es funktioniert nicht. Ich habe die Beispiele in the java.util.stream.Collectors documentation nachgeschlagen.

Wie muss ich diese Funktionen verwenden?

Antwort

10

Wenn Sie die Elemente gruppieren möchten, müssen Sie groupingBy verwenden:

import static java.util.stream.Collectors.*; 

Map<Long, Long> primeFactorCount = primeFactors.stream() 
     .collect(groupingBy(p -> p, counting())); 
+0

Ich habe es schon einmal versucht, aber gab einen Fehler, stellt sich heraus, ich hatte vergessen, java.util.Map automatisch zu importieren. – skiwi

2

Wenn Sie Eclipse Collections (früher GS Collections) verwenden, können Sie den folgenden für die Primfaktoren Liste und der wichtigste Faktor Zahl verwenden. Eine Tasche ist im Grunde eine Map<K, Integer>.

MutableList<Long> primeFactors = this.primeFactors(factorProduct); 
Bag<Long> primeFactorCount = primeFactors.toBag(); 

ein FastList im primeFactors oben beschriebene Methode verwendet werden.

Im Falle von Eclipse-Sammlungen haben wir primitive Listen und Taschen, so dass Sie keine Ergebnisse boxen müssen.

LongList primeFactors = this.primeFactors(factorProduct); 
LongBag primeFactorCount = primeFactors.toBag(); 

Verwenden a LongArrayList stattdessen im primeFactors oben beschriebene Methode.

Hinweis: Ich bin Committer für Eclipse Collections.

Verwandte Themen