Search code examples
javasortingjava-8treemap

TreeMap sorting not working when using Collectors.groupingBy()


My list is like,

List<Map<String, Object>> sortedList = new ArrayList<>();

where my list is as,

[{column_changed=first_name, sequence_number=190001, change_date=2019-01-01, customer_number=3100}, {column_changed=last_name, sequence_number=190001, change_date=2019-01-01, customer_number=3100}, {column_changed=mail_id, sequence_number=19002, change_date=2019-01-05, customer_number=3101}, {column_changed=date_of_birth, sequence_number=190002, change_date=2019-01-05, customer_number=3101}, {column_changed=nationality, sequence_number=190002, change_date=2019-01-05, customer_number=3101}, {column_changed=contact_number, sequence_number=19003, change_date=2019-01-10, customer_number=3102}]

I initialize an instance of Map as follows,

Map<String, List<Map<String, Object>>> mySortedMap = new TreeMap<>();

When I use Collectors.groupingBy() using sequence_number,

mySortedMap = sortedList.stream().collect(Collectors.groupingBy(change -> (String)change.get("sequence_number")));

the output is as follows,

{190001=[{column_changed=first_name, sequence_number=190001, change_date=2019-01-01, customer_number=3100}, {column_changed=last_name, sequence_number=190001, change_date=2019-01-01, customer_number=3100}], 19003=[{column_changed=contact_number, sequence_number=19003, change_date=2019-01-10, customer_number=3102}], 19002=[{column_changed=mail_id, sequence_number=19002, change_date=2019-01-05, customer_number=3101}, {column_changed=date_of_birth, sequence_number=190002, change_date=2019-01-05, customer_number=3101}, {column_changed=nationality, sequence_number=190002, change_date=2019-01-05, customer_number=3101}]}

But I need the keys to be sorted. Though the instance is a TreeMap, the keys are not sorted. I could'nt figure out why. Can anyone help me with this.


Solution

  • Here you are changing the object referred by mySortedMap. The map returned by groupingBy() can be of any type. From documentation,

    There are no guarantees on the type, mutability, serializability, or thread-safety of the Map or List objects returned.

    If your list is sorted try using,

    mySortedMap = sortedList.stream().collect(Collectors.groupingBy(
        change -> (String) change.get("sequence_number"), TreeMap::new, Collectors.toList()));