2016-04-15 2 views
0

Ich habe flache Datei mit Daten. Einige der Hauptattribute sind [Land, Staat, Stadt, Vorname, Nachname, Alter, Einkommen, CreditScore, ...]Multi-Level Group By mit Zählungen auf jeder Ebene in Java?

Ich brauche folgende Gruppenordnung: Land -> Bundesland -> Stadt -> Alter

Zusätzlich, sagen wir, ich brauche zählt auf jeder Gruppenebene ... etwas kann einfach mit RDBMS GROUP BY getan werden! aber ich habe keine Datenbank (oder kann einfach nicht verwenden), es ist flache Datei Daten.

Ein Weg ist mit HashMap zu tun, aber auf einer Ebene oder zwei große Werke, wie Ebenen Code erhöhen kompliziert ist ...

Map<String, Integer> count = new HashMap<String, Integer>(); 
Iterator<RandomObject> i = r.iterator(); 

while (i.hasNext()) { 
    String key=i.next().getName(); 
    if (count.containsKey(key)) { 
     int rr =Integer.valueOf(count.get(key)); 
     rr++; 
     count.put(key, rr); 
    }else{ 
     count.put(key, 1); 
    } 

}  

Gibt es eine saubere Lösung in Java für dieses Problem?

Antwort

1

Da Sie nach einer sauberen Lösung gefragt haben. Der beste Weg, dies zu tun, wird mit Hilfe von Java 8

import java.util.List; 
import java.util.Map; 
import java.util.stream.Collectors; 
import java.util.stream.Stream; 
class Student { 

    String stud_id; 
    String stud_name; 
    String stud_location; 

    public String getStud_id() { 
     return stud_id; 
    } 

    public String getStud_name() { 
     return stud_name; 
    } 

    public String getStud_location() { 
     return stud_location; 
    } 



    Student(String sid, String sname, String slocation) { 

     this.stud_id = sid; 
     this.stud_name = sname; 
     this.stud_location = slocation; 

    } 
} 

class Temp 
{ 
    public static void main(String args[]) 
    { 

     Stream<Student> studs = 
     Stream.of(new Student("1726", "John", "New York"), 
       new Student("4321", "Max", "California"), 
       new Student("2234", "Max", "Los Angeles"), 
       new Student("7765", "Sam", "California")); 
     Map<String, Map<Object, List<Student>>> map= studs.collect(Collectors.groupingBy(Student::getStud_name,Collectors.groupingBy(Student::getStud_location))); 
       System.out.println(map);//print by name and then location 
    } 

} 

{Max = {Los Angeles = [Studenten @ 214c265e], Kalifornien = [Studenten @ 448139f0]}, John = {New York = [Studenten @ 7cca494b] }, Sam = {Kalifornien = [Student @ 7ba4f24f]}}

+0

Wie machst du mit Multi-Level? – gpa

+0

Aktualisiert für Multi-Level, nach Name und Ort. Ich hoffe, das hilft. – Chirag