首页 > 解决方案 > java - 如何在Java类中最好地存储来自CSV的数据?单个 Row 对象列表,还是具有嵌套对象的单个对象?

问题描述

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对象或 aList<Row>中,并将其发送到 API 以解析为 JSON。这工作正常,但我觉得这不是最好的方法。
是否有其他更面向对象的方式来利用Date, District, County,Cases列。

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

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对象的列表,每个日期一个。

这看起来是不是有点矫枉过正?是否有其他一些干净的方法可以将此数据集读入允许轻松汇总摘要信息的数据结构。

我目前正在做的方式现在有效,但我正在寻找更好的方式!

标签: javaoopdesign-patternsapi-design

解决方案


根据您的描述,您的方法似乎是合理的,并且是面向对象的。但是,如果没有其他信息(例如,可能另有规定的特定聚合),您的 District 对象中有多个“重复的”“County”对象似乎很奇怪。例如:

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

从面向对象的角度来看,您似乎需要一个额外的聚合级别,按“日期”(每个日期包含一个“县”行列表)。

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


推荐阅读