如何将List <string []>转换为List <myobject>?

时间:2016-06-30 14:28:40

标签: java string csv object

我从csv文件中获取了一个List。这个csv文件以这种方式填充:

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

所以我这样做:

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

现在,我想创建另一个MyObject类型的列表,如:

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

MyObject包含的类:

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

他们的获取和设置。 第一个清单中的内容应移入:

{{1}}

我该怎么做?

5 个答案:

答案 0 :(得分:1)

以下是您可以尝试的内容:

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);
}

我希望有帮助

答案 1 :(得分:1)

如果MyObject.class有一个可以使用3个信息的构造函数,那么:

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

否则试试这个:

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

答案 2 :(得分:1)

如果在对象类中创建匹配的构造函数(或转换器或其他),则可以使用流操作。

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...
    //....
}

然后你可以直接阅读你的对象类型。

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

答案 3 :(得分:0)

假设MyObject有一个构造函数,例如:

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;
    }
}

然后你可以这样做:

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

使用分裂器的替代方案:

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

答案 4 :(得分:-1)

第1步 - 确保正确初始化CSVReader

根据API documentationCSVReader(Reader reader, char separator, char quotechar, int line),您可以使用正确的构造函数跳过第一行,还需要指定quotecharseparator,以便它知道格式数据

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

第2步 - 使用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);
});

或者更好地为它定义适当的构造函数:

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

并简化循环:

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

问题 - 如果您有1000列,该怎么办?

正如arizzle提到的那样,在一个类中包含1000个字段并不是一个好主意,在这种情况下,最好使用HashMap而不是MyObject