2016-08-10 2 views
1

Ich brauche etwas Hilfe. Ich weiß nicht, wie ich mein Problem lösen soll. Ich habe Textdatei in diesem Format:Datenauswertung von Textdatei

personx 25 
personz 2 
persony 5 
persony 7 
personi 55 
personx 25 

Ich brauche die Zahlen für jede Person zu zählen. Die Ausgabe sollte "personx = 50" etc. sein.
Ich kann mein altes System nicht benutzen, wo ich wusste, dass es 10 Leute gibt. Also hatte ich 10 Variablen und ich ging einfach durch die Datei mit Scanner und überprüft, ob die Zeile mit "personx" beginnt und dann die Zahl zu Variable personx usw. zählen. Ich möchte diese Variablen jetzt nicht verwenden. Ich möchte den Code nicht nach jeder neuen Person ändern.
Wie löst man das? Ich möchte diese Ausgabe vom höchsten zum niedrigsten sortiert haben:

personi = 55 
personx = 50 
persony = 12 
personz = 2 

Ist das möglich, ohne Variablen

personi, personx, persony, personz ?
Meine Idee durch die Datei zu gehen war und die Namen zu scannen. Speichern Sie den Namen in einem Array und fügen Sie einen anderen Namen in ein Array ein, wenn dieser Name noch nicht im Array vorhanden ist. Also werde ich die Namen haben.
Als nächstes werde ich die Datei erneut scannen und nach dem Namen und der Nummer suchen. Überprüfen Sie Name + Nummer und speichern Sie dann die Nummer in einem anderen Array auf der gleichen Position wie der Name im ersten Array. Also werde ich haben

Names[0] = "personi"; 
Count[0] = 55; 
Names[1] = "personx"; 
Count[1] = 50; 

Und dann werde ich nur diese beiden Arrays mit für Zyklus drucken.

Ich denke nicht, dass es die beste Lösung ist. Wie würdest du es machen? Gibt es etwas besseres/schneller/einfacher? Und wie löst man diese Sortierung?
Vielen Dank für Ihre Zeit.

+0

Verwenden Sie ein 'Map ' –

Antwort

2

Sie können uns Map<String,Integer>

In diesem Fall i TreeMap verwendet, die alles für Sie sortiert werden. Wenn Sie keine Sortierung benötigen, verwenden Sie einfach HashMap anstelle von TreeMap.

Map<String, Integer> map = new TreeMap(); 
    try { 
     BufferedReader reader = new BufferedReader(new FileReader(new File("C:/iPhone/persons.txt"))); 
     String line = ""; 
     String [] person = new String[2]; 
     while ((line = reader.readLine()) != null) { 
      person = line.split(" "); 
      String name = person[0]; 
      int number = Integer.parseInt(person[1]); 
      map.put(name,map.getOrDefault(name,0)+number); 
     } 
     reader.close(); 
    } catch (IOException ioe) { 
     ioe.printStackTrace(); 
    } 
    map.forEach((k,v)->System.out.println(k + " = " + v)); 

} 

persons.txt:

personx 25 
personz 2 
persony 5 
persony 7 
personi 55 
personx 25 

Ausgang:

personi = 55 
personx = 50 
persony = 12 
personz = 2 

1) Kann ich diese auf Datei verwenden, wo Linie nicht in meinem Format ist, aber es hat zum Beispiel .. diese Format ? "Personx bla bla 25"? Ist es möglich, es auch zu konvertieren? Wie?

Ja, Sie können eine Methode erstellen, die es für Sie tun wird. Sie können entweder String-Splits oder einen Regex verwenden.

2) Warum gibt es String [] person = new String [2]; ?

Fehler, sollte es String[1] sein. Korrigiert jetzt

3) was ist String line = ""; ?

Es ist nur neu String, wo ich jede Zeile speichern, die ich aus der Datei gelesen habe. Wie Sie sehen können, im reder.readLine() in While-Schleife zuweisen. Danach spalte ich es einfach.

EDIT: Geändert Code so Person kann mehrere Parameter haben, aber wird nur zuerst als Name und zuletzt als Nummer.

public static void main(String[] args) { 
     Map<String, Integer> map = new TreeMap(); 
      try { 
       BufferedReader reader = new BufferedReader(new FileReader(new File("C:/iPhone/persons.txt"))); 
       String line = ""; 
       String [] person; 
       while ((line = reader.readLine()) != null) { 
        person = line.split(" "); 
        String name = person[0]; 
        int number = Integer.parseInt(person[person.length-1]); 
        map.put(name,map.getOrDefault(name,0)+number); 
       } 
       reader.close(); 
      } catch (IOException ioe) { 
       ioe.printStackTrace(); 
      } 
      map.forEach((k,v)->System.out.println(k + " = " + v)); 
     } 

persons.txt:

personx asdasdas dasd asd a 25 
personz 2 
persony asd asd asd a 5 
persony 7 
personi 55 
personx 25 

Ausgang:

personi = 55 
personx = 50 
persony = 12 
personz = 2 
+1

Hallo, danke für die Antwort! Das hat viel geholfen! :) Ich habe einige qetions .. 1) Kann ich diese Datei verwenden, wo Zeile nicht in meinem Format ist, aber es hat zum Beispiel .. dieses Format? "Personx bla bla 25"? Ist es möglich, es auch zu konvertieren? Wie? 2) Warum gibt es String [] person = new String [2]; ? Warum nicht String [] person = new String [1]; ? 3) Was ist String line = ""; ? :) – Kym

+0

@Kym Antwort bearbeitet, bitte sieh es dir an. Und lassen Sie mich beispielsweise wissen, ob die Eingabe "personx bla bla bla 25" ist, was ausgegeben werden soll? "personx 25" oder "personx bla bla bla 25"? –

+0

Vielen Dank für Ihre Antwort! :) Die Ausgabe sollte "personx 25" sein – Kym