如何最好地将来自 CSV 的数据存储在 java class 中?单个 Row 对象列表,还是具有嵌套对象的单个对象?

How to best store data from CSV in java class? A single list of Row objects, or a single object with nested objects?

Date,Locality,District,New Cases,Hospitalizations,Deaths
5/21/2020,Accomack,Eastern Shore,709,40,11
5/21/2020,Albemarle,Thomas Jefferson,142,19,4
5/21/2020,Alleghany,Alleghany,9,4,0
5/21/2020,Amelia,Piedmont,22,7,1
5/21/2020,Amherst,Central Virginia,25,3,0
5/21/2020,Appomattox,Central Virginia,25,1,0
5/21/2020,Arlington,Arlington,1763,346,89
... // skipped down to the next day
5/20/2020,Accomack,Eastern Shore,709,39,11
5/20/2020,Albemarle,Thomas Jefferson,142,18,4
5/20/2020,Alleghany,Alleghany,10,4,0
5/20/2020,Amelia,Piedmont,21,7,1
5/20/2020,Amherst,Central Virginia,25,3,0
5/20/2020,Appomattox,Central Virginia,24,1,0
5/20/2020,Arlington,Arlington,1728,334,81
5/20/2020,Augusta,Central Shenandoah,88,4,1
... // continued

我在 CSV 中有美国一个州的数据,如上所示,我想对其进行一些数据分析,以便我可以通过休息 API 发送它。我想做的数据分析是各种汇总,例如:按日期划分的全州总案件数、整个州的总案件数、按地区分组的总案件数、按日期划分的地区总案件数、一个县的总案件数按日期等。只是可以对这些数据进行的所有基本分组。

现在,我的问题是弄清楚如何在没有数据库的情况下将这些数据正确存储在 java 中。我有一个使用 Row 对象列表的成功实现,其中每个 Row 对象仅包含 CSV 中的一行。然后使用 java 的 Stream api 我已经能够过滤并获得其中一些统计数据。然后我将这些统计信息打包成一个 Row 对象或一个 List<Row> 并将其发送到 API 以解析为 JSON。效果不错,但我觉得这不是最好的方法。
是否有其他一些更面向对象的方式来利用 DateDistrictCountyCases 列。

我正在考虑做这样的事情:

class State {
     List<District> districtList;
     String name;
}

class District {
     List<County> countyList;
     String name;
}

class County {
     LocalDate date;
     String name;
     int cases;
     // more stuff
}

然后我将创建一个 State 对象,其中包含 District 个对象的列表,每个对象包含许多 County 个对象的列表,每个日期一个。

这看起来是不是太过分了?是否有其他一些干净的方法可以将此数据集读入一个数据结构,以便轻松聚合摘要信息。

我目前使用的方法现在可行了,但我正在寻找更好的方法!

从您的描述来看,您的方法似乎很合理,并且正确地面向对象。但是,如果没有其他信息(例如,可能另有规定的特定聚合),您的 District 对象中会有多个 "duplicate" 'County' 对象似乎很奇怪。例如:

[{"date":"5/21/2020","name":"Accomack"},
 {"date":"5/20/2020","name":"Accomack"}]

从面向对象的角度来看,您似乎需要 "Date" 的额外聚合级别(每个日期包含 'County' 行的列表)。

一个考虑因素:如果您的聚合与数据库方法更好地对齐,我认为源数据中的每一行都应该保留和查询 AS/IS,通过 Stream lambdas 过滤和排序。