Pages

Tuesday, April 7, 2020

Java Map Sort By Values - Sort TreeMap Or HashMap By Value + Java 8

1. Introduction


In this article, We'll learn how to sort Map by Values in ascending or descending order. In the previous article discussed how to sort the TreeMap in ascending or reverse order.

Map can be anything such as HashMap or TreeMap which needs to be sorted based on its values rather than keys.

Always, TreeMap does sorting based on its keys but not on values, but in the interview first, they will ask how to sort the Map. If you give the answer then the next question is on sorting values alone.



2. Custom comparator Sorting based on Value


First, let us create a custom comparator which sorts based on the values instead of keys. The below method takes Map as an argument and writes a logic for the custom comparator. This comparator logic gets the corresponding value for a key from the map passed as an argument and compares against values.

Finally, Create a new TreemMap and pass the custom value comparator to this new map. Add all values from the map passed to the new TreeMap created.

public static > Map sortByValues(final Map map) {

  // custom comparator based don values.
  Comparator valueComparator = new Comparator() {
   public int compare(K k1, K k2) {
    V v1 = map.get(k1);
    V v2 = map.get(k2);
    int compare = v1.compareTo(v2);
    if (compare == 0) {
     return 1;
    } else {
     return compare;
    }

   }
  };

  // Creating a new TreeMap
  Map sortedByValues = new TreeMap(valueComparator);
  sortedByValues.putAll(map);
  return sortedByValues;
 }

But, Here need to have noted on the point is that directly we can not sort the original TreeMap upon values. We need to create a new TreeMap with a custom comparator.

3. TreeMap sort by value


Now let us create a TreeMap and add a few values to it. Call the above sortByValues() method by passing the map.


package com.java.w3schools.blog.treemap;

import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;

public class TreeMapSortByValue {
 public static void main(String args[]) {

  TreeMap treemap = new TreeMap();

  treemap.put("3 IN", "India");
  treemap.put("1 US", "United States");
  treemap.put("2 AUS", "Australia");
  treemap.put("5 PAK", "Pakistan");
  treemap.put("4 UK", "United Kingdom");

  System.out.println("Treemap before sorting : " + treemap);

  // sort treemap by values
  Map sortedMap = sortByValues(treemap);

  System.out.println("Treemap after sorting : " + sortedMap);

 }

 public static > Map sortByValues(final Map map) {

  // custom comparator based don values.
  Comparator valueComparator = new Comparator() {
   public int compare(K k1, K k2) {
    V v1 = map.get(k1);
    V v2 = map.get(k2);
    int compare = v1.compareTo(v2);
    if (compare == 0) {
     return 1;
    } else {
     return compare;
    }

   }
  };

  // Creating a new TreeMap
  Map sortedByValues = new TreeMap(valueComparator);
  sortedByValues.putAll(map);
  return sortedByValues;
 }
}

Output:

Treemap before sorting : {1 US=United States, 2 AUS=Australia, 3 IN=India, 4 UK=United Kingdom, 5 PAK=Pakistan}
Treemap after sorting : {2 AUS=Australia, 3 IN=India, 5 PAK=Pakistan, 4 UK=United Kingdom, 1 US=United States}

4. Sort HashMap By Value


Now, We write a logic to sort hashmap by value. The same logic works for HashMap as well. Just need to pass the HashMap object to the sortByValues() method.

Map hashMapObject = new HashMap();

hashMapObject.put("1", "One");
hashMapObject.put("2", "Two");
hashMapObject.put("3", "Three");
hashMapObject.put("4", "Four");
hashMapObject.put("5", "FIve");

System.out.println("HashMap before sorting : " + hashMapObject);

// sort treemap by values
Map sortedHashMap = sortByValues(hashMapObject);

System.out.println("HashMap after sorting : " + sortedHashMap);

Output:

HashMap before sorting : {1=One, 2=Two, 3=Three, 4=Four, 5=FIve}
HashMap after sorting : {5=FIve, 4=Four, 1=One, 3=Three, 2=Two}

5. Java 8 Sort By Value


Java 8 Stream API has support to sort by key for a Map.

stream(): converts the keys set into Stream<Entry<K, V>
sorted(Map.Entry.comparingByValue()): Sorts the entry set by value using comparingByValue() comparator.
Collectors.toMap(): Collects the output into map.

collect() method is part of the Terminal Operations.

// java 8 sorting

Map java8HashMapApproach = hashMapObject.entrySet().stream()
  .sorted(Map.Entry.comparingByValue())
  .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));

System.out.println("Java 8 HashMap : " + java8HashMapApproach);

Map java8TreeMapApproach = treemap.entrySet().stream().sorted(Map.Entry.comparingByValue())
  .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));

System.out.println("Java 8 TreeMap : " + java8TreeMapApproach);

Output:

Java 8 HashMap : {5=FIve, 4=Four, 1=One, 3=Three, 2=Two}
Java 8 TreeMap : {2 AUS=Australia, 3 IN=India, 5 PAK=Pakistan, 4 UK=United Kingdom, 1 US=United States}

6. Conclusion


In this article, We've seen how to sort TreeMap or HashMap by value instead of key, TreeMap sorts by key by default. And seen how to build the custom comparator to sort by value.

GitHub Code

StackOverFlow

No comments:

Post a Comment

Please do not add any spam links in the comments section.