2016-05-15 11 views
1

Ich habe eine Methode, die eine Anzahl der Objekte zurückgibt, die einen höheren Wert haben als der Durchschnitt aller Objekte in einem ArrayList.Was ist der beste Weg, den Durchschnittswert von Objekten zu finden, die in einer Arraylist gespeichert sind?

Das Objekt 'Benutzer' hat den ganzzahligen Wert innerhalb seiner Klasse (Ebene) gespeichert.

Meine Methode funktioniert, aber ich frage mich, ob es eine bessere Möglichkeit gibt, den Durchschnitt aller Objektwerte zu finden?

public int bestPlayers() { 

    ArrayList<User> players = new ArrayList<User>(); 
    int bestPlayers = 0; 
    int totalPlayerLevel = 0; 
    double averageLevel = 0; 

    for (int i = 0; i < players.size(); i++) { 
     totalPlayerLevel += players.get(i).level; 
    } 

    averageLevel = totalPlayerLevel/players.size(); 

    for (int i = 0; i < players.size(); i++) { 
     if (players.get(i).level > averageLevel) { 
      bestPlayers++; 
     } 
    } 

    return bestPlayers; 
} 
+4

'averageLevel = (double) totalPlayerLevel/players.size;' für bessere Präzision. – MikeCAT

+0

http://stackoverflow.com/questions/12002332/how-to-manipulate-arrays-find-the-average-beginner-java – Idos

+0

'averageLevel = (double) totalPlayerLevel/players.size();' könnte besser sein, weil Die Eigenschaft 'java.util.ArrayList.size' ist privat. – MikeCAT

Antwort

6

Java 8 bietet eine bessere Art und Weise, mit IntStream#average().

double average = players.stream() 
         .mapToInt(p -> p.level) 
         .average() 
         .orElse(0); 

Dann zur Ausgabe der Anzahl von "überdurchschnittlich" Spieler:

return (int) players.stream() 
        .filter(p -> p.level > average) 
        .count(); 
+0

Wenn du einen Stream zeigen willst, zeige auch die zweite Hälfte, also die "besten Spieler". Gerade jetzt ist es eine unvollständige Antwort. – Andreas

+0

@Andreas Die Frage nur nach einem besseren Weg, um den Durchschnitt zu finden, aber ich habe aktualisiert. – 4castle

+0

Keine Notwendigkeit, 'mapToInt()'. Mach einfach 'filter (p -> p.level> average)'. – Andreas

2

Ihr Code funktioniert in O(n), da Sie zweimal durch Array reisen. Nun, da Sie den Durchschnitt berechnen müssen, bedeutet das, dass Sie mindestens einmal reisen müssen, daher gibt es keine Option für eine schnellere Leistung als O(n).

Als Zweites musst du Spieler zählen, deren Level höher als der Durchschnitt ist. Nur Beschleunigung hier könnte sein, wenn Sie Array sortiert haben (haben Sie vorher, nicht jetzt berechnen, seit seiner O(nlogn), dann können Sie zuerst mit höherem Niveau dann Durchschnitt und berechnen die Zahl des Rests. Das würde O(logn) kosten, aber seine Leistung ist immer noch O(n), da Sie berechnete durchschnittliche

+0

Ist das deine sehr langatmige Art, * Nein * auf die Frage zu antworten * "Gibt es einen besseren Weg?" *? – Andreas

+0

nur erklären, warum Nein :) –

+0

Das ist gut zu verstehen, schätze ich die Erklärung! – girthquake