我从csv文件中得到了一个列表。这个csv文件是这样填充的:
_Name_ |_Surname_|_Sex_
_nam1_ | _sur1_ | _s1_
_nam2_ | _sur2_ | _s2_
CSVReader reader = new CSVReader(new FileReader("file.csv"));
List<String[]> myEntries = reader.readAll();
现在,我想创建另一个MyObject类型的列表,如:
List<MyObject> list = new ArrayList<MyObject>();
类MyObject包含:
private String name;
private String surname;
private String sex;
和它们的get和set。第一个列表中的内容将被移动到:
list.setName();
list.setSurname();
list.setSex();
我该怎么做?
你可以试试:
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);
}
我希望这对你有帮助
如果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);
}
如果在对象类中创建匹配的构造函数(或转换器或其他),则可以使用流操作。
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());
假设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());
第一步 -确保正确初始化CSVReader
根据CSVReader(Reader reader, char separator, char quotechar, int line)
的API文档,您可以使用适当的构造函数跳过第一行,还需要指定quotechar
和separator
,以便它知道数据的格式。
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
。