3 回答
TA贡献1946条经验 获得超4个赞
虽然一般来说我不赞成使用Map用于保存对象的字段,但如果属性的数量很大,甚至可能因 CSV 文件而异(例如,某些文件有一个人就读的大学,另一个没有),那么使用 aMap来保存属性可能是合适的。
在这种情况下,可以定义一个简单的Person类:
public class Person {
Map<String, String> props = new HashMap<>();
public void addProperty(String propertyName, String value) {
// could add error checking to ensure propertyName not null/emtpy
props.put(propertyName, value);
}
/**
* returns the value of the property; may return null
*/
public String getProperty(String propertyName) {
return props.get(propertyName);
}
}
如果知道将始终加载某些属性/属性,则getName()可以添加诸如此类的访问器:
public String getName() {
return props.get("name");
}
public int getAge() {
String age = props.get("age");
// or throw exception if missing
return (age != null ? Integer.parseInt(age) : -1);
}
尽管请注意,对于大多数数据集,我希望 name 不是单个条目,因为通常会有姓氏、名字等。 尽管如此,有限数量的常见预期值的模式是相同的。此外,您可以进行调整,以便您可以直接获取某些知名字段的整数值。
然后,在解析文件时,保留具有属性定义的标题行。然后,对于随后读取的每一行,创建一个新Person对象,然后按顺序添加属性。
List<Person> allPersons = new ArrayList<>();
while ( (line = READ_NEXT_LINE) ) {
// NOTE: this is not a safe way to handle CSV files; should really
// use a CSV reader as fields could have embedded commas
attrs[] = line.split(",");
Person p = new Person();
for (int i = 0; i < titleRow.length; ++i) {
p.addProperty(titleRow[i], attrs[i]);
}
allPersons.add(p);
}
然后你可以得到一个特定Person的Person myPerson = allPersons.get(index_of_person),和你使用的方式非常相似Javascript,你可以做String val = myPerson.getProperty("age")。
如果您需要按给定的属性进行搜索,则可以allPersons根据给定的属性对等价性进行流/循环和检查。
// find all people of a given age
List<Person> peopleAge20 = allPersons.stream()
.filter(p -> p.getAge() == 20)
.collect(Collectors.toList());
System.out.println(peopleAge20);
// summary statics (average age) for all people
IntSummaryStatistics stats =
allPersons.stream().mapToInt(p -> p.getAge()).summaryStatistics();
System.out.printf("Average age: %f\n", stats.getAverage());
请注意,这种方法确实打破了 a 的想法Javabean,但这可能是也可能不是问题,具体取决于您的要求。
添加回答
举报