Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 树映射奇怪的行为_Java_Collections_Treemap - Fatal编程技术网

Java 树映射奇怪的行为

Java 树映射奇怪的行为,java,collections,treemap,Java,Collections,Treemap,基本上,我试图实现的是按照降序对最终的地图进行排序。(最新日期在地图的开头) 我有以下方法,将DTObject的ArrayList作为参数和静态鉴别器字符串: public static <T> Map<T, List<String>> groupTimePeriods(List<DtObject> timePeriods, String groupProperty) { Map<T, List<String&

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

我有以下方法,将DTObject的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;
    }
然而,当我尝试做同样的事情时,由于日期按降序排列(时间段列表),整个地图都被弄乱了:

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);
}
publicstaticmap-groupTimePeriods(列出时间段、stringgroupproperty、comparatortreemapcomparator)
{

Map groupedTimePeriods=new TreeMap((你是否在问为什么一个TreeMap会根据它的键对自己进行排序?因为这实际上就是一个TreeMap的全部要点。如果你想保持插入顺序,你只需要使用另一种为此而构建的映射类型(比如LinkedHashMap)“……但是日期是按降序排列的……”-请注意,树映射使用键的自然顺序,即日期的升序。如果希望映射按降序排序,则需要提供反向“自然顺序”比较器,例如,通过
comparator.naturalOrder().reversed()
树状图将自动对键进行排序,而不考虑插入顺序,只要它们实现了
可比性
。如果您希望始终按降序对键进行排序,并且不希望覆盖它们的行为(使用
日期
),或者元素实际上是最终的(例如
字符串
),您需要在初始化
映射时插入
比较器
。您还可以在其上调用
下降映射
,以生成反向排序映射,这似乎是最简单的解决方案。是的,非常感谢,我知道。在初始化映射时如何执行此操作?@JoeD使用正确的构造函数。请标记它作为答案,所以无论谁检查,它都显示为已回答
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=[]}
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);
}