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 中拥有上述美国某个州的数据,并希望对其进行一些数据分析,以便我可以通过 rest API 发送它。我想做的数据分析是各种聚合,例如:按日期划分的全州病例总数,整个州的病例总数,按地区分组的病例总数,按日期划分的区总病例数,按日期划分的县病例总数等。只是可以用这些数据做的所有基本分组。
现在,我的问题是弄清楚如何在没有数据库的情况下将这些数据正确地存储在java中。我有一个使用 Row 对象列表的成功实现,其中每个Row
对象在 CSV 中只包含一行。然后使用 java 的Stream api
我已经能够过滤并获取其中一些统计数据。然后,我将这些统计信息打包到单个Row
对象或List<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
}
然后,我将创建一个包含District
对象列表的State
对象,每个对象都包含许多County
对象的列表,每个日期一个。
这似乎有点矫枉过正吗?是否有其他干净的方法可以将此数据集读取到数据结构中,以便轻松聚合摘要信息。
我目前的做法现在有效,但我正在寻找更好的方法!
从你的描述来看,你的方法似乎是合理的,并且正确地面向对象。 但是,如果没有其他信息(例如,可能另有规定的特定聚合(,在您的地区对象中有多个"重复"的"县"对象似乎很奇怪。 例如:
[{"date":"5/21/2020","name":"Accomack"},
{"date":"5/20/2020","name":"Accomack"}]
从面向对象的角度来看,您似乎希望按"日期"(每个日期都包含"县"行列表(进行额外的聚合级别。
一个考虑因素:如果您的聚合与数据库方法更好地保持一致,我认为源数据中的每一行都应该按原样保留和查询,通过 Stream lambda 进行过滤和排序。