Mittelwert anhand eines Stream berechnen

Sandro95

Bekanntes Mitglied
Hey Leute ,
eine alt klausuraufgabe war wie folgt : man soll eine neue methode schreiben die den Mittelwert aller Zahlen in der Liste die man übergibt berechnet. Und das anhand eines Streams

Die Methode war vorher gegeben :

Code:
 fold(List<Integer> liste, int reduce, binaryoperator<Integer>) {

Wie man zb eine fold Methode für eine Summe schreibt ist mir bewusst


Code:
public static int fold(Collection<Integer> list, int id, BinaryOperator<Integer> op) {
        
        return list.stream().reduce(id,op);
    }


// Main aufruf

        System.out.println(Numbers.fold(liste, 0 ,(a,b)-> (a+b)));

wie macht man das aber mit dem Mittelwert ?

lg
 
Da (anders als bei der Summe) das arithmetische Mittel nicht ganzzahlig sein muss, brauchst du schonmal float/double oder eine andere Zahlenrepräsentation (und nicht int/Integer).
Hier sind aber die Rahmenbedingungen der Aufgabe noch nicht klar genug. Darfst du z.B. einfach die Signatur der fold-Methode anpassen?
Und muss die fold-Methode unbedingt genutzt werden?
Oder kannst du z.B. auch einfach einen IntStream nutzen, der von sich aus ein average() mitbringt.
Und muss die Propagation des Mittelwertes durch die Stream-fold/reduce-Operation selbst geschehen?
Am Ende des Tages ist das arithmetische Mittel ja einfach nur die Summe aller Elemente, geteilt durch die Anzahl der Elemente.
Im einfachsten Fall hätte ich es wohl so gelöst:
Java:
System.out.println((double) fold(liste, 0, (a, b) -> a+b) / liste.size());
Und: Was hat das bitte mit GUI-Programmierung ( AWT, Swing, JavaFX & SWT ) zu tun?
 
Da (anders als bei der Summe) das arithmetische Mittel nicht ganzzahlig sein muss, brauchst du schonmal float/double oder eine andere Zahlenrepräsentation (und nicht int/Integer).
Hier sind aber die Rahmenbedingungen der Aufgabe noch nicht klar genug. Darfst du z.B. einfach die Signatur der fold-Methode anpassen?
Und muss die fold-Methode unbedingt genutzt werden?
Oder kannst du z.B. auch einfach einen IntStream nutzen, der von sich aus ein average() mitbringt.
Und muss die Propagation des Mittelwertes durch die Stream-fold/reduce-Operation selbst geschehen?
Am Ende des Tages ist das arithmetische Mittel ja einfach nur die Summe aller Elemente, geteilt durch die Anzahl der Elemente.
Im einfachsten Fall hätte ich es wohl so gelöst:
Java:
System.out.println((double) fold(liste, 0, (a, b) -> a+b) / liste.size());
Und: Was hat das bitte mit GUI-Programmierung ( AWT, Swing, JavaFX & SWT ) zu tun?


Das passt aber nicht ,

für die zahlen :
liste.add(7);
liste.add(7);
liste.add(14);
liste.add(7);


bekomme ich als ergebnis :6.0 was nicht stimmen kann
 
Ich weiss nicht, welchen Code du da ganz exakt ausgeführt hast, aber bei mir kommt hier 8.75 raus:
Java:
import java.util.*;
import java.util.function.BinaryOperator;
public class Numbers {
  private static int fold(Collection<Integer> list, int id, BinaryOperator<Integer> op) {
    return list.stream().reduce(id, op);
  }
  public static void main(String[] args) {
    List<Integer> liste = Arrays.asList(7, 7, 14, 7);
    System.out.println((double) fold(liste, 0, (a, b) -> a+b) / liste.size());
  }
}
 

Zurück
Oben