java - 在 ArrayList 中存储不同类型的对象
问题描述
我的应用程序从 csv 文件中读取数据并将其存储在对象中。我的 Load 类为此具有“load”方法,它读取 csv 并将其数据存储在两个对象中,然后将它们分组到一个 ArrayList 中,然后由该方法返回,我所指的两个对象是:
AHeader object
仅存储 csv 的标题(也就是 csv 的第一行)。每 csv 的每一行动态生成一个
。
这两个对象是不同的,它们有不同的字段和不同的方法。List(ArrayList) of GameData objects
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 中,我想知道如何做到这一点(或者甚至可能),因为我希望“加载”方法返回单个 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;
}
- 我找到了这个解决方案,但我不喜欢它,因为那时我将有一个空接口,只是为了分组,因为我看不到在其中创建新方法的令人信服的理由。
- 我也不喜欢对象解决方案,因为每次我想返回列表中的对象时都需要转换类型。
- 另一种解决方案是 Header Class 扩展 GameData 类,这样我可以将 Header 对象放在 GameData ArrayList 中,但对我来说似乎不正确,因为 Header 不需要来自 GameData 的任何字段或方法,因此继承将是仅适用于该特定操作。
PD:我不能只使用一个对象来存储所有数据,因为标题(csv 的第一行)都是字符串,而 csv 中的其余行包含字符串和 int 值的混合。同样从结构上讲,它没有意义,因为每个对象都会有这些标头,这将是多余的,因为这些对象已经具有同名的字段。
解决方案
在我看来,“Header”对象和“GameData”对象总是一起使用。如果你制作了一个“游戏”对象,它有
- ArrayList 类型的“标签”实例变量
- ArrayList 类型的“游戏”实例变量
并返回整个对象?已经过了一分钟,但我很确定您可以创建一个私有类,这实际上会使您的代码更具可读性。
推荐阅读
- java - 使用最低数量的硬币更改总值,同时排除特定硬币,并将结果作为字符串返回
- python - 在 Python 中使用 PyVISA 通过 GPIB 连接到仪器
- docker - 无法在 AWS 上的 Windows Server 2019 上运行 Linux Docker 容器
- java - Java 无法访问 src/main/resources 中的 txt 文件
- symfony - Doctrine Symfony ManyToMany 将表作为 OneToMany 连接到其他表
- android - 如何在android studio中的背景图像上添加按钮和其他元素
- python - AWS EMR 上的 pyspark 提交命令
- javascript - 为什么我不能使用 RSASSA-PKCS1-v1_5 加密/解密?
- wordpress - Word Press 根文件夹重定向
- angular - 获取路由上的查询参数,Angular 服务器端渲染