【发布时间】:2018-09-20 14:20:16
【问题描述】:
我创建了一个带有 Comparator 的 Map 以按键排序,但在填充 Map 后,在填充数据后没有应用顺序。
SimpleDateFormat byDay = new SimpleDateFormat("ddMMyyyy");
Map<String, DoubleSummaryStatistics> menuStatisticsXDay = new TreeMap<String, DoubleSummaryStatistics>(
new Comparator<String>() {
@Override
public int compare(String dateStr1, String dateStr12) {
Date date1 = new Date();
Date date2 = new Date();
try {
date1 = byDay.parse(dateStr1);
} catch (ParseException e) {
}
try {
date2 = byDay.parse(dateStr1);
} catch (ParseException e) {
}
return date1.compareTo(date2);
}
});
menuStatisticsXDay =
menuPrices.stream().sorted(comparing(MenuPrice::getUpdateDate))
.collect(Collectors.groupingBy(cp -> byDay.format(cp.getUpdateDate()),
Collectors.summarizingDouble(cp -> cp.getPriceInDouble())));
这样做它会对键进行排序,但作为字符串,所以“06092018”将比“07082018”排在前面,这就是为什么我想使用我的比较器,转换为日期并对其进行排序,然后“07082018”将排在第一位“06092018”:
Map<String, DoubleSummaryStatistics> menuStatisticsXDay =
menuPrices.stream().sorted(comparing(MenuPrice::getUpdateDate))
.collect(Collectors.groupingBy(m -> byDay.format(m.getUpdateDate()),
Collectors.summarizingDouble(m -> m.getPriceInDouble())))
.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,(oldValue, newValue) -> oldValue, LinkedHashMap::new));
【问题讨论】:
-
您的
TreeMap无关紧要,因为您正在使用流操作返回的完全不同的Map引用覆盖menuStatisticsXDay变量。除此之外,您处理潜在ParseExceptions 的方式会导致不一致。
标签: lambda java-8 functional-programming java-stream