树状图怪异行为

时间:2019-09-03 09:17:25

标签: java collections treemap

基本上,我要实现的是按降序对最终地图进行排序。 (最新日期在地图的开头)。

我有以下方法,该方法将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(),但由于性能问题,我不想这样做。

谢谢。

1 个答案:

答案 0 :(得分:0)

非常感谢您 我已将方法更改为

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()

现在很好!

相关问题