Gewichteten Durchschnitt mit Java 8 Streams berechnen

8

Wie gehe ich vor, um den gewichteten Mittelwert eines Map<Double, Integer> zu berechnen, wobei der Integer-Wert das Gewicht für den Double-Wert ist, der gemittelt werden soll. zB: Karte hat folgende Elemente:

  1. (0.7, 100) // Wert ist 0.7 und Gewicht ist 100
  2. (0,5, 200)
  3. (0,3, 300)
  4. (0.0, 400)

Ich möchte die folgende Formel mithilfe von Java 8-Streams anwenden, bin mir aber nicht sicher, wie man Zähler und Nenner zusammen berechnen und gleichzeitig beibehalten kann. Wie benutzt man die Reduktion hier?

    
Vivek Sethi 04.11.2016, 10:14
quelle

2 Antworten

10

Sie können für diese Aufgabe einen eigenen Collector erstellen:

%Vor%

Dieser benutzerdefinierte Kollektor übernimmt zwei Funktionen als Parameter: Einer ist eine Funktion, die den für ein bestimmtes Stream-Element zu verwendenden Wert zurückgibt (als ToDoubleFunction ), und das andere gibt das Gewicht zurück (als ToIntFunction ). Es verwendet eine lokale Hilfsklasse, die Zähler und Nenner während des Sammelvorgangs speichert. Jedes Mal, wenn ein Eintrag akzeptiert wird, wird der Zähler erhöht mit dem Ergebnis, dass der Wert mit seinem Gewicht multipliziert wird, und der Nenner wird mit dem Gewicht erhöht. Der Finisher gibt dann die Division der beiden als Double zurück.

Eine Beispielverwendung wäre:

%Vor%     
Tunaki 04.11.2016, 10:51
quelle
0

Sie können dieses Verfahren verwenden, um den gewichteten Durchschnitt einer Karte zu berechnen. Beachten Sie, dass der Schlüssel des Karteneintrags den Wert enthalten und der Wert des Karteneintrags das Gewicht enthalten sollte.

%Vor%

Sie können sich den Komponententest ansehen, um einen Anwendungsfall zu sehen.

%Vor%

Sie benötigen diese Importe für die Komponententests:

%Vor%

Sie benötigen diese Importe für den Code:

%Vor%

Ich hoffe, es hilft.

    
Mohammad 27.06.2017 18:33
quelle

Tags und Links