2016-06-30 17 views
-1

Ich habe eine Liste aus einer CSV-Datei. Diese CSV-Datei auf diese Weise aufgefüllt wird:Wie konvertiert man die Liste <String[]> in die Liste <MyObject>?

_Name_ |_Surname_|_Sex_ 
_nam1_ | _sur1_ | _s1_ 
_nam2_ | _sur2_ | _s2_ 

So tun i:

CSVReader reader = new CSVReader(new FileReader("file.csv")); 
List<String[]> myEntries = reader.readAll(); 

Nun, ich möchte myObject eine andere Liste erstellen, der Art wie:

List<MyObject> list = new ArrayList<MyObject>(); 

wo die Klasse MyObject enthält:

private String name; 
private String surname; 
private String sex; 

mit ihrem Get und Set.

list.setName(); 
list.setSurname(); 
list.setSex(); 

Wie kann ich dies tun: Und was ist in der ersten Liste wird in verschoben werden?

Antwort

-1

Schritt 1 - Stellen Sie sicher, dass Sie CSVReader richtig initialisiert haben.

Nach API documentation mit CSVReader(Reader reader, char separator, char quotechar, int line) Sie die erste Zeile mit dem entsprechenden Konstruktor überspringen können, auch müssen Sie die quotechar und separator so spezifizieren sie das Format der Daten kennt.

CSVReader reader = new CSVReader(new FileReader("file.csv"), ',', '_', 1); 

Schritt 2 - Sammle Objekte java.util.stream

myEntries.forEach(entity -> { 
    MyObject object = new MyObject(); 

    object.setName(entity[0]); 
    object.setSurname(entity[1]); 
    object.setSex(entity[2]); 

    list.add(object); 
}); 

oder besser definieren, die richtige Konstruktor für es wie folgt verwendet:

public MyObject(String name, String surname, String sex) { 
    setName(name); 
    setSurname(surname); 
    setSex(sex); 
} 

und vereinfachen Loop:

myEntries.forEach(entity -> list.add(new MyObject(entity[0], entity[1], entity[2])); 

Frage - Was ist, wenn Sie 1000 Spalten haben?

Als arizzle erwähnt, ist es keine gute Idee, 1000 Felder in einer Klasse und für diesen Fall verwenden Sie besser HashMap anstelle von MyObject.

+0

Was passiert, wenn meine Array-Liste 1000 Strings enthält? – Marco

+0

@Marco meinst du 1000 Spalten oder 1000 Reihen? – gevorg

+0

Ich meine 1000 Spalten. Vorname, Nachname, Alter, Geschlecht, Höhe, Gewicht, Land, Geburtstag, ... – Marco

1

Hier ist, was Sie versuchen können:

List<MyObject> list = new ArrayList<MyObject>(); 

for(String[] entry : myEntries){ 
    MyObject obj = new MyObject(); 
    //assign values to properties of our object 
    obj.setName(entry[0]); 
    obj.setSurname(entry[1]); 
    obj.setSex(entry[2]); 

    //add object to list 
    list.add(obj); 
} 

Ich hoffe, dass

+0

Ich denke, Sie müssen die erste Zeile überspringen, da sie Metainformationen enthält. – gevorg

1

Wenn MyObject hilft.Klasse hat einen Konstruktor, der mit 3 Informationen arbeitet als Sie verwenden können:

for (String[] item : myEntries) { 
     list.add(new MyObject(item[0], item[1], item[2]); 
    } 

Ansonsten versuchen Sie dies:

for (String[] item : myEntries) { 
     MyObject myObj = new MyObject(); 
     myObj.setName(item[0]); 
     myObj.setSurname(item[1]); 
     myObj.setSex(item[2]); 
     list.add(myObj); 
    } 
+0

Was ist, wenn meine Array-Liste 1000 Strings enthält? – Marco

+0

@Marco Ich verstehe nicht, was du meinst? Ihre ArrayList kann nur Objekte aus der Klasse MyObject enthalten. – Blobonat

+0

bedeuten 1000 Spalten. Name, Nachname, Alter, Geschlecht, Größe, Gewicht, Land, Geburtstag, .... – Marco

0

Unter der Annahme, MyObject einen Konstruktor, zB:

public final class MyObject { 

    private final String name, surname, sex; 

    public MyObject(final String name, final String surname, final String sex) { 
     this.name = name; 
     this.surname = surname; 
     this.sex = sex; 
    } 
} 

Dann sind Sie kann tun:

List<MyObject> myObjects = reader.readAll() 
           .stream() 
           .map(entry -> new MyObject(entry[0], entry[1], entry[2])) 
           .collect(Collectors.toList()); 

Alternative einer spliterator mit:

List<MyObject> myObjects = StreamSupport.stream(csvReader::spliterator, ORDERED, true) 
           .map(entry -> new MyObject(entry[0], entry[1], entry[2])) 
           .collect(Collectors.toList()); 
+0

Ich denke, Sie müssen die erste Zeile überspringen, da sie Metainformationen enthält. – gevorg

+0

@gevorg Ich glaube, es gibt eine Option, wenn Sie den 'CSVReader' konstruieren, um die Anzahl der zu überspringenden Zeilen anzugeben. – explv

+0

Ja, Sie sind richtig [CSVReader] (http://opencsv.sourceforge.net/apidocs/com/opencsv/ CSVReader.html) der 'line' Parameter ist nur dafür :) – gevorg

1

Wenn Sie einen passenden Konstruktor (oder Konverter oder was auch immer) in der Objektklasse zu erstellen, können Sie Stream-Operationen verwenden.

public class MyObject { 
    private String name; 
    private String surname; 
    private String sex; 

    public MyObject(){} 

    public static MyObject fromStringArr(String[] csvVals) { 
     assert csvVals != null && csvVals.length >= 3; 

     MyObject m = new MyObject(); 
     m.name = csvVals[0]; 
     m.surname = csvVals[1]; 
     m.sex = csvVals[2]; 
     return m; 
    } 

    //Getters and setters for MyObject... 
    //.... 
} 

Dann können Sie direkt in Ihren Objekttyp lesen.

CSVReader reader = new CSVReader(new FileReader("file.csv")); 
List<MyObject> myEntries = reader.readAll().stream().skip(1).map(MyObject::fromStringArr).collect(Collectors.toList()); 
+0

Ich denke, Sie müssen die erste Zeile überspringen, da sie Metainformationen enthält. – gevorg

+1

@gevorg bearbeitet, um die erste Zeile zu überspringen – Mshnik

Verwandte Themen