2016-07-14 39 views
3

Ich habe eine getrennte TXT-Datei, in der es eine Liste von "Studenten" mit ihrer eigenen Marke auf der Seite, die von 0 bis 10 geht, ist hier ein Beispiel dafür, wie die .txt wie folgt aussieht:Berechnen von Durchschnitt aus einer Liste von Studenten aus einer TXT-Datei

Mark 2
Elen 3
Luke 7
Elen 9
Jhon 5
Mark 4
10 Elen
Luke 1
Jhon 1
Jhon 7
Elen 5
Mark 3
Mark 7

Was ich tun möchte, ist der Durchschnitt der einzelnen Schüler Berechnung (ausgedrückt in double), so dass die Ausgabe aussehen würde, dies:

Mark: 4.0 
Elen: 6.75 
Luke: 4.0 
Jhon: 4.33 

Hier ist, was ich habe kommen mit, denn jetzt habe ich es geschafft, nur Properties zu verwenden, um die Schülernamen ohne repe zur Liste Aber die Zahl, die auf jeder Seite zu sehen ist, ist offensichtlich die letzte, die das Programm findet.
ich es auf einer Schaltfläche Action enthalten habe, wie ich eine GUI bin Umsetzung, indem Sie die Taste über die Ausgabe Drücken gezeigt ist append in einem TextArea:

b1.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent d) { 

    try { 
     File file = new File("RegistroVoti.txt"); 
     FileInputStream fileInput = new FileInputStream(file); 
     Properties properties = new Properties(); 
     properties.load(fileInput); 
     fileInput.close(); 

     Enumeration enuKeys = properties.keys(); 
     while (enuKeys.hasMoreElements()) { 
     String key = (String) enuKeys.nextElement(); 
     String value = properties.getProperty(key); 
     l1.append(key + ": " + value + "\n"); 
     } 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    } 
}); 

Ich dachte Collectors zu verwenden, um den Mittelwert zu berechnen , aber ich weiß wirklich nicht, wie man es einführt ...

Irgendwelche Hilfe wird geschätzt!

Vielen Dank im Voraus!

+0

Zum Sammeln lernen zukünftige Verwendung. http://www.tutorialspoint.com/java/java_collections.htm – UDID

+4

Sie könnten eine 'HashMap' verwenden, die Schlüssel-Wert-Paare speichert ... Ihr Schlüssel wäre der Name des Schülers und Ihr Wert könnte eine' ArrayList' sein Punkte. Nachdem Sie die Datei gelesen haben, können Sie über die 'HashMap' iterieren und den Durchschnitt für jeden Schüler basierend auf der 'ArrayList' von Scores berechnen. – brso05

+0

Die Verwendung von Eigenschaften funktioniert nicht, da die Eigenschaft Mark nur einen Wert hat. – Grayson

Antwort

3

Die Art, wie ich diese Art von Ding mag, ist mit Map s und List s.

Um die Zeilen aus der Datei gelesen, ich bin der nio Lesart gern, also würde ich dann

List<String> lines = Files.readAllLines(Paths.get("RegistroVoti.txt")); 

tun Sie eine HashMap<String,List<Integer>> machen können, was jede Person gespeichert werden Namen und eine Liste der mit ihnen verbundenen Zahlen:

HashMap<String, List<Integer>> studentMarks = new HashMap<>(); 

Dann wird unter Verwendung einer für jede Schleife, durch jede der Linien gehen und jede Nummer auf der Hash-Karte hinzufügen:

for (String line : lines) { 
    String[] parts = line.split(" "); 
    if (studentMarks.get(parts[0]) == null) { 
     studentMarks.put(parts[0], new ArrayList<>()); 
    } 
    studentMarks.get(parts[0]).add(Integer.parseInt(parts[1])); 
} 

Dann können Sie jeden Eintrag in der Karte gehen und berechnen den Mittelwert der zugehörigen Liste:

for (String name : studentMarks.keySet()) { 
    System.out.println(name + " " + studentMarks.get(name).stream().mapToInt(i -> i).average().getAsDouble()); 
} 

(Beachten Sie, dass es sich um eine Java 8 stream Lösung; Sie könnte genauso gut eine for Schleife schreiben es

Für weitere Informationen über einige der Dinge, die in früheren Versionen) zu berechnen, die ich verwendet habe, siehe:

Hoffe das hilft!

bearbeiten Eine komplette Lösung:

b1.addActionListener(new ActionListener() { 

    public void actionPerformed(ActionEvent d) { 
     try { 
      List<String> lines = Files.readAllLines(Paths.get("RegistroVoti.txt")); 

      Map<String, List<Integer>> studentMarks = new HashMap<>(); 

      for (String line : lines) { 
       String[] parts = line.split(" "); 

       if (studentMarks.get(parts[0]) == null) { 
        studentMarks.put(parts[0], new ArrayList<>()); 
       } 
       studentMarks.get(parts[0]).add(Integer.parseInt(parts[1])); 
      } 

      for (String name : studentMarks.keySet()) { 
       System.out.println(name + " " + studentMarks.get(name).stream().mapToInt(i -> i).average().getAsDouble()); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
}); 
+0

Zunächst einmal vielen Dank für Ihre Antwort! Alle meine Probleme wurden erfolgreich gelöst und ich lernte auch Neues! Allerdings sollte ich einige Hinweise für eine andere Sache brauchen, die ich machen muss ... Ich möchte in einem 'TextArea' ein ** vertikales Histogramm ** drucken, das die Vorkommnisse jeder einzelnen Stimme in der .txt Datei enthält (Bsp:" 1 "hätte 2 asterisks," 2 "hätte 1 askerisk und so weiter), ich habe gesucht, aber leider konnte ich keine Lösung schreiben, die richtig kompiliert. –

+0

@ TobiaZamò Ich bin froh, dass ich helfen konnte. Ihre Anfrage ist zu lang, um in einem Kommentar beantwortet zu werden. Es wäre besser, wenn du eine neue Frage stellst (http://stackoverflow.com/questions/ask) (falls du das nicht schon getan hast). Auf diese Weise können Menschen vollständige Antworten posten, und Sie können eine vollständige Frage stellen, mit dem, was Sie versucht haben. – ricky3350

+0

Kein Problem, ich habe es schon aussortiert! –