我目前正从数据库中获取数据:
Model---Year
aaaaa---2010
aaaaa---2011
aaaaa---2012
bbbbb---2010
bbbbb---2011
我通过SQL语句,getJdbcTemplate和ResultSet获取此数据。然后将其存储在值对象列表中:
List<ModelAndYear> modelYearList = new ArrayList<ModelAndYear>();
我的ModelAndYear类是这样的:
public class ModelAndYear{
private String model;
private String year;
public String getModel() {
return model;
}
public void setModel(String model) {
this.model= model;
}
public String getYear() {
return year;
}
public void setYear(String year) {
this.year= year;
}
如何获取填充的modelYearList,其数据的格式为:
aaaaa,2010
aaaaa,2011
aaaaa,2012
bbbbb,2010
bbbbb,2011
并将其分类为
的格式Map<String, List<String>>
所以数据的格式为:
aaaaa,<2010,2011,2012>
bbbbb,<2010,2011>
我不知道从哪里开始。
我有:
Map<String, List<String>> newModelYearList = new HashMap<String, List<String>>();
for(int i=0; i < modelYearList.size(), i++){
//sorting will occur here i think?
//how do i program the action of getting model from list 1 and checking if it exists in list 2?
}
答案 0 :(得分:3)
只要您拥有Java 8,就可以使用流一次性完成此操作。
您实际上要做的是groupBy
功能,但也应用map
。以下是您正在寻找的内容(为了清晰起见,添加了大量缩进):
Map<String, List<String>> yearsByModel =
modelYearList
.stream()
.collect(
Collectors.groupingBy(
may -> may.getModel(),
Collectors.mapping(may -> may.getYear(), Collectors.toList())));
答案 1 :(得分:0)
我不想只是给出代码,你应该尝试自己做。
这是你应该做的:
创建一个包含字符串和列表的新地图,就像您想要的那样,例如将其称为结果
循环遍历modelYearList
获取模块并检查结果映射是否已包含具有相同模块字符串的键
如果是,请获取与模块一起存储的列表,并添加年份
如果没有,请创建一个新的类型字符串列表并添加年份,并将其存储在带有模块名称的结果中
注意:我将使用HashSet和HashMap,但如果需要,也可以使用List和Map
2015-10-21T05:06:25.380-05:00
答案 2 :(得分:0)
此代码根据您的要求提供了结果图:
Map<String, List<String>> resultMap =
modelYearList
.stream()
.collect(
Collectors.groupingBy(
ModelAndYear::getModel,
Collectors.mapping(ModelAndYear::getYear, Collectors.toList())));
resultMap.forEach((k, v) -> System.out.println(k +" : "+ v.toString()));