如何在java中将多个日期作为值对地图进行排序
如何将HashMap条目按多个值排序为日期 假设我有一个带有键字符串和值的映射,作为带有2个日期的对象 按对象中的两个日期进行排序如何在java中将多个日期作为值对地图进行排序,java,collections,Java,Collections,如何将HashMap条目按多个值排序为日期 假设我有一个带有键字符串和值的映射,作为带有2个日期的对象 按对象中的两个日期进行排序 Map<String, dateWrapper> map = new HashMap<>(); map.put("user10",new dateWrapper("20180131","20181231")); map.put("user3",new dateWrapper("20170131","20171231")); map.
Map<String, dateWrapper> map = new HashMap<>();
map.put("user10",new dateWrapper("20180131","20181231"));
map.put("user3",new dateWrapper("20170131","20171231"));
map.put("user5",new dateWrapper("20160131","20161231"));
map.put("user1",new dateWrapper("20170131","20170131"));
**注意:以上字符串使用SimpleDataFormat解析为日期
预期输出为user5、user1、user3、user10
公共类dateWrapper实现可序列化{
private Date date1;
private Date date2;
}
List<Map.Entry<String, dateWrapper>> dateWrapperEntries = new ArrayList<>(map.entrySet());
Trying below this but its returning null
Collections.sort(dateWrapperEntries, Map.Entry.comparingByValue(Comparator.comparing(dateWrapper::getDate1).thenComparing(dateWrapper::getDate2)));
private static Date convertStringToDate(String inputStr) {
Date inputDate = null;
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMdd");
try {
inputDate = sdf.parse(inputStr);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return inputDate;
}
它返回null集合的返回类型。sort为void。它不可能返回null。准确地告诉您问题是什么,即实际输出是什么。此代码段生成一个正确排序的列表。您能详细说明您面临的问题是什么吗?当我打印dateWrapperEntries时,仅打印为[]这意味着你的地图是空的。SimpleDateFormat是出了名的麻烦,它和Date都过时很久了。所以避免使用它们。使用LocalDate from和DateTimeFormatter.BASIC_ISO_Date进行解析。它不长,它的日期使用了Comparator.ComparingActual Date很长:-Date.getTime很长,@balajiThank你们知道它在工作吗map为null,如果我的错误赋值是错误的,我添加了可选选项,在map为null时不抛出NPE
public static List<String> sort(Map<String, dateWrapper> map) {
// comparator to compare two dateWrapper from Map.Entry value
final Comparator<Map.Entry<String, dateWrapper>> comparator =
Comparator.comparing((Function<Map.Entry<String, dateWrapper>, Date>)e -> e.getValue().getDate1())
.thenComparing(e -> e.getValue().getDate2());
// convert map to entry set and compare it
return Optional.ofNullable(map).orElse(Collections.emptyMap()).entrySet().stream()
.sorted(comparator)
.map(Map.Entry::getKey)
.collect(Collectors.toList());
}