Basically, what I am trying to achieve is to sort the final map in descending order. (the latest dates are in the beginning of the map).
I have the following method which takes an ArrayList of DtObjects as a parameter and a static discriminator string:
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;
}
I know DtObject might be really complicated but here all I need is just a simple Date object
T groupPropertyValue = timePeriod.<T> getProperty(groupProperty);
Returns Date.
For example when I put dates in ascending order it looks so well, there's no mess
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=[]}
However, when I try to do the same thing but with the dates coming in descending order (timePeriods list) the whole map is messed up:
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=[]}
It does sort the map in ascending order every time something's been put. Why is so? How to override it?
Another bypass it to create a copy of the current map and call Collections.reverse()
but I don't want to do it because of the performance issues.
Thanks in advance.