Java 如何转换列表<;字符串[]>;进入列表<;MyObject>;?

Java 如何转换列表<;字符串[]>;进入列表<;MyObject>;?,java,string,csv,object,Java,String,Csv,Object,我从csv文件中获得了一个列表。此csv文件以以下方式填充: _Name_ |_Surname_|_Sex_ _nam1_ | _sur1_ | _s1_ _nam2_ | _sur2_ | _s2_ 因此,我: CSVReader reader = new CSVReader(new FileReader("file.csv")); List<String[]> myEntries = reader.readAll(); 带着他们的出发点和出发点。 第一个列表中的内容应移到

我从csv文件中获得了一个列表。此csv文件以以下方式填充:

_Name_ |_Surname_|_Sex_
_nam1_ | _sur1_  | _s1_
_nam2_ | _sur2_  | _s2_
因此,我:

CSVReader reader = new CSVReader(new FileReader("file.csv"));
List<String[]> myEntries = reader.readAll();
带着他们的出发点和出发点。 第一个列表中的内容应移到:

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

如何执行此操作?

步骤1-确保正确初始化

根据
CSVReader(Reader-Reader,char-separator,char-quotechar,int-line)
可以使用适当的构造函数跳过第一行,还需要指定
quotechar
分隔符
,以便它知道数据的格式

CSVReader reader = new CSVReader(new FileReader("file.csv"), ',', '_', 1);
步骤2-使用

或者最好像这样为它定义合适的构造函数:

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个栏怎么办


如前所述,在一个类中有1000个字段不是一个好主意,在这种情况下,最好使用
HashMap
而不是
MyObject

以下是您可以尝试的:

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);
}
List List=new ArrayList();
for(字符串[]条目:myEntries){
MyObject obj=新的MyObject();
//为对象的属性赋值
对象集合名(条目[0]);
对象设置名称(条目[1]);
对象设置(条目[2]);
//将对象添加到列表中
列表。添加(obj);
}

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

假设
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 myObjects=reader.readAll()
.stream()
.map(条目->新建MyObject(条目[0],条目[1],条目[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());
List myObjects=StreamSupport.stream(csvReader::spliterator,有序,true)
.map(条目->新建MyObject(条目[0],条目[1],条目[2]))
.collect(Collectors.toList());

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

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());
CSVReader reader=newcsvreader(newfilereader(“file.csv”);
List myEntries=reader.readAll().stream().skip(1).map(MyObject::fromStringArr).collect(Collectors.toList());

如果我的数组列表包含1000个字符串怎么办?@Marco我不明白你的意思?ArrayList只能包含MyObject.mean类1000列中的对象。姓名、姓氏、年龄、性别、身高、体重、国家/地区、生日等。@Marco Than您必须自己调用每个Setter,或者您可以在MyObject.class中创建一个构造函数,该构造函数接受您可以传递字符串数组。我想您需要跳过第一行,因为它包含元信息。如果我的数组列表包含1000个字符串怎么办?@Marco你是说1000列还是1000行?我是说1000列。姓名、姓氏、年龄、性别、身高、体重、国家、生日等。@Marco在这种情况下,您还需要解析元信息,请查看更新的答案。@Marco如果您有1000列,我认为您不希望将所有信息存储在一个包含1000个setter和1000个getter的类中……我认为您需要跳过第一行,因为它包含元信息。我认为您需要跳过第一行,因为它包含元信息。我认为您需要跳过第一行,因为它包含元信息。@gevorg我相信在您构造
CSVReader
时,有一个选项可以指定要跳过的行数,您是对的,
参数正是针对这一点:)
List<MyObject> myObjects = StreamSupport.stream(csvReader::spliterator, ORDERED, true)
                               .map(entry -> new MyObject(entry[0], entry[1], entry[2]))
                               .collect(Collectors.toList());
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());