2017-02-03 3 views
0

Ich schreibe ein Programm, das eine TXT-Datei Zeile für Zeile liest, und ich möchte für jeden 'eindeutigen' Wert einer Spalte eine ArrayList erstellen.Wie erstellt man eine ArrayList für jeden eindeutigen Spaltenwert einer TXT-Datei in Java?

Was die .txt-Datei wie folgt aussieht:

NAME   AGE   COUNTRY   PHONE NUMBER 
Peter   28   USA    00112233 
John   25   England   11223344 
Justin  22   Australia  22334455 
Daisey  24   Canada   33445566 
Harry   27   England   44556677 
Laura   25   England   55667788 
Gary   28   USA    66778899 

Zum Beispiel habe ich für jede Nationalität eine Arraylist erstellen möchte, mit den entsprechenden Namen als Elemente.

Also, das:

ArrayList USA:  Peter, Gary 
ArrayList England: John, Harry, Laura 
ArrayList Australia: Justin 
ArrayList Canada: Daisey 

Ich will nicht die ArrayLists selbst erstellen, bevor das Programm ausgeführt wird. Da die wirkliche Spalte, über die ich spreche, viele verschiedene Werte hat, sollten viele ArrayList gemacht werden. Weiß jemand, wie ich das Programm ein Arraylist für jede eindeutige Nationalität erstellen lassen kann, und die entsprechenden Namen zu diesem ArrayList hinzufügen?

+3

'Karte > so etwas wie das? – SomeJavaGuy

+1

Sie können [this] (http://stackoverflow.com/questions/30755949/java-8-lambdas-group-list-into-map) auch interessant finden. – yeputons

Antwort

1

Nun, ist es einfacher, mit Domain-Objekten zu arbeiten wie:

class User { 
    String name; 
    String country; 
    int age; 
    String phone; 
    // getters and setters omitted 
} 

Irgendwo im Code wird es Verfahren wie:

List<User> readfromFile(String fileName) { 
    // create User for each read line 
} 

Und dann benötigt Spalte Gruppe verwenden Stream-Api wie :

Map<String, List<User>> usersByCountry = users.stream().collect(Collectors.groupingBy(User::getCountry)); 

Wenn Sie nur Benutzernamen nach Ländern gruppiert werden sollen:

Map<String, List<String>> userNamesByCountry = users.stream().collect(Collectors.groupingBy(User::getCountry, LinkedHashMap::new, Collectors.mapping(User::getName, Collectors.toList()))); 
Verwandte Themen