简体   繁体   中英

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.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM