基本上,我想要实现的是按降序对最终地图进行排序。 (最新日期在地图的开头)。
我有以下方法,它将DtObjects的ArrayList作为参数和静态鉴别符字符串:
public static <T> Map<T, List<String>> groupTimePeriods(List<DtObject> timePeriods, String groupProperty)
{
Map<T, List<String>> groupedTimePeriods = new TreeMap<>();
if (timePeriods == null)
{
return groupedTimePeriods;
}
for (DtObject timePeriod : timePeriods)
{
GWT.log(groupedTimePeriods.toString());
T groupPropertyValue = timePeriod.<T> getProperty(groupProperty);
if (groupPropertyValue != null)
{
List<String> group = groupedTimePeriods.get(groupPropertyValue);
if (group == null)
{
groupedTimePeriods.put(groupPropertyValue, group = new ArrayList<>());
}
Long startTime = timePeriod.getProperty(Constants.TimePeriod.START_TIME);
Long endTime = timePeriod.getProperty(Constants.TimePeriod.END_TIME);
if (startTime != null || endTime != null)
{
group.add(formatTimePeriod(startTime, endTime));
}
}
}
return groupedTimePeriods;
}
我知道DtObject可能真的很复杂,但是这里我只需要一个简单的Date对象
T groupPropertyValue = timePeriod.<T> getProperty(groupProperty);
返回日期。
例如,当我将日期按升序排列时,它看起来非常好,没有混乱
ConsoleLogger.java:32 {}
ConsoleLogger.java:32 {Mon Sep 02 00:00:00 GMT+500 2019=[]}
ConsoleLogger.java:32 {Mon Sep 02 00:00:00 GMT+500 2019=[1:00-2:00]}
ConsoleLogger.java:32 {Mon Sep 02 00:00:00 GMT+500 2019=[1:00-2:00], Wed Sep 04 00:00:00 GMT+500 2019=[]}
ConsoleLogger.java:32 {Mon Sep 02 00:00:00 GMT+500 2019=[1:00-2:00], Wed Sep 04 00:00:00 GMT+500 2019=[], Fri Sep 06 00:00:00 GMT+500 2019=[]}
ConsoleLogger.java:32 {Mon Sep 02 00:00:00 GMT+500 2019=[1:00-2:00], Wed Sep 04 00:00:00 GMT+500 2019=[], Fri Sep 06 00:00:00 GMT+500 2019=[], Sat Sep 14 00:00:00 GMT+500 2019=[]}
ConsoleLogger.java:32 {Mon Sep 02 00:00:00 GMT+500 2019=[1:00-2:00], Wed Sep 04 00:00:00 GMT+500 2019=[], Fri Sep 06 00:00:00 GMT+500 2019=[], Sat Sep 14 00:00:00 GMT+500 2019=[], Tue Sep 17 00:00:00 GMT+500 2019=[]}
但是,当我尝试执行相同的操作但日期按降序排列(timePeriods列表)时,整个地图混乱了:
ConsoleLogger.java:32 {}
ConsoleLogger.java:32 {Wed Sep 25 00:00:00 GMT+500 2019=[]}
ConsoleLogger.java:32 {Tue Sep 17 00:00:00 GMT+500 2019=[], Wed Sep 25 00:00:00 GMT+500 2019=[]}
ConsoleLogger.java:32 {Sat Sep 14 00:00:00 GMT+500 2019=[], Tue Sep 17 00:00:00 GMT+500 2019=[], Wed Sep 25 00:00:00 GMT+500 2019=[]}
ConsoleLogger.java:32 {Fri Sep 06 00:00:00 GMT+500 2019=[], Sat Sep 14 00:00:00 GMT+500 2019=[], Tue Sep 17 00:00:00 GMT+500 2019=[], Wed Sep 25 00:00:00 GMT+500 2019=[]}
ConsoleLogger.java:32 {Wed Sep 04 00:00:00 GMT+500 2019=[], Fri Sep 06 00:00:00 GMT+500 2019=[], Sat Sep 14 00:00:00 GMT+500 2019=[], Tue Sep 17 00:00:00 GMT+500 2019=[], Wed Sep 25 00:00:00 GMT+500 2019=[]}
ConsoleLogger.java:32 {Mon Sep 02 00:00:00 GMT+500 2019=[1:00-2:00], Wed Sep 04 00:00:00 GMT+500 2019=[], Fri Sep 06 00:00:00 GMT+500 2019=[], Sat Sep 14 00:00:00 GMT+500 2019=[], Tue Sep 17 00:00:00 GMT+500 2019=[], Wed Sep 25 00:00:00 GMT+500 2019=[]}
每次放置地图时,它都会按升序对地图进行排序。
为什么会这样呢?
如何覆盖它?
另一个绕过它来创建当前地图的副本并调用
Collections.reverse()
,但是由于性能问题,我不想这样做。提前致谢。
最佳答案
非常感谢你
我将方法更改为
public static <T> Map<T, List<String>> groupTimePeriods(List<DtObject> timePeriods, String groupProperty,Comparator treeMapComparator)
{
Map<T, List<String>> groupedTimePeriods = new TreeMap<>((Comparator<? super T>) treeMapComparator);
}
由于降序的最后一个参数是
Comparator.naturalOrder().reversed()
现在很好!