【发布时间】:2020-05-05 21:36:13
【问题描述】:
我的应用程序从 csv 文件中读取数据并将其存储在对象中。我的 Load 类为此具有“load”方法,它读取 csv 并将其数据存储在两个对象中,然后将它们分组到一个 ArrayList 中,然后由该方法返回,我所指的两个对象是:
Header object 仅存储 csv 的标题(也就是 csv 的第一行)。List(ArrayList) of GameData objects 每行 csv 动态生成。
这两个对象是不同的,它们有不同的字段和不同的方法。
CSV
| Game | Map | Players | <--- Stored in a Header object |
| ========================== | | Want to store both
| Game1 | Panguea | 6 | <--- | Stored in an ArrayList | the Header and the ArrayList
| Game2 | Panguea | 8 | <--- | containing the three objects | in a new ArrayList.
| Game3 | Medium | 12 | <--- | |
这里的问题是 我不能将两个不同类型的对象放入同一个 ArrayList 并且我想知道如何做到这一点(或者甚至可能),因为我想要“ load" 方法返回一个 ArrayList,这样我就可以将它用于其他功能,例如我有一个 Printer class,它有一个打印传递给它的对象的方法。
这是完成工作的方法:
public List<GameData> load(){
// List for store the data which is brought by the scanner
mainView = new ArrayList<>();
// Scanner eluded for clarity
// Get the headers
String[] tableHeader = scanner.nextLine().split("\\t");
headerFields = new Headers(tableHeader);
mainView.add(headerFields);
// Get the rest of the data
while (scanner.hasNextLine()) {
try{
String[] elements = scanner.nextLine().split("\\t");
mainView.add(new GameData(some params...);
}catch (ArrayIndexOutOfBoundsException e){
System.out.println(e);
}
}
return mainView;
}
- 我找到了this solution,但我不喜欢它,因为这样我就会有一个空接口,只是为了分组,因为我看不到在其中创建新方法的令人信服的理由。
- 我也不喜欢 Object 解决方案,因为这样我每次想要返回 List 中的对象时都需要转换类型。
- 另一种解决方案是 Header 类扩展 GameData 类,这样我可以将 Header 对象放在 GameData ArrayList 中,但对我来说似乎不正确,因为 Header 不需要来自 GameData 的任何字段或方法,所以继承仅适用于该特定操作。
PD:我不能只使用一个对象来存储所有数据,因为标题(csv 的第一行)都是字符串,而 csv 中的其余行包含字符串和 int 值的混合。同样从结构上讲,它没有意义,因为每个对象都会有这些标头,这将是多余的,因为这些对象已经有同名的字段。
【问题讨论】:
-
存储在同一个数组列表中的唯一选择是使用
Object。而是创建一个新类,其中Headers作为成员,GameData列表作为成员。 -
不确定它是否适合您的用例,但我发现在使用 csv 使用 3 方库(例如 4)时它更简洁。 org.apache.commons.csv。有助于分离关注点。据我回忆,它允许读取第一行的标题,然后是其余内容。
标签: java