This example will demonstrate how to sort a map based on values. In the set up, we will create a map of candy bars keyed by calories and value of the name of the candy bar. Then each snippet will show how to order the hashmap by value. In a comparable example we demonstrate how to sort a dictionary or hashmap by value in groovy .
Setup Map < Integer , String > CANDY_BARS ;
@Before
public void setUp () {
CANDY_BARS = new HashMap < Integer , String >();
CANDY_BARS . put ( 233 , "REESE'S P-BUTTER CUPS" );
CANDY_BARS . put ( 222 , "REESE'S P-BUTTER CUPS" );
CANDY_BARS . put ( 284 , "TWIX, CARAMEL" );
CANDY_BARS . put ( 232 , "ALMOND JOY" );
CANDY_BARS . put ( 149 , "YORK PEPPERMINT PATTIE" );
}
Straight up Java First creating a java Comparator, this snippet will sort map values in ascending order by passing the comparator to Collections.sort.
@Test
public void sort_map_by_values_java () {
Comparator < Map . Entry < Integer , String >> byMapValues = new Comparator < Map . Entry < Integer , String >>() {
@Override
public int compare ( Map . Entry < Integer , String > left , Map . Entry < Integer , String > right ) {
return left . getValue (). compareTo ( right . getValue ());
}
};
// create a list of map entries
List < Map . Entry < Integer , String >> candyBars = new ArrayList < Map . Entry < Integer , String >>();
// add all candy bars
candyBars . addAll ( CANDY_BARS . entrySet ());
// sort the collection
Collections . sort ( candyBars , byMapValues );
logger . info ( candyBars );
assertEquals ( "ALMOND JOY" , candyBars . get ( 0 ). getValue ());
}
Output
[
232=ALMOND JOY,
222=REESE'S P-BUTTER CUPS,
233=REESE'S P-BUTTER CUPS,
284=TWIX, CARAMEL,
149=YORK PEPPERMINT PATTIE
]
Java 8 This snippet will sort hashmap by value in descending order using java 8. Using a lambda expression we will create a comparator that will compare each entry value. Next calling calling the Stream.sort we will pass the comparator then calling Comparator.reverse.
@Test
public void sort_map_by_values_java8 () {
Comparator < Entry < Integer , String >> byValue = ( entry1 , entry2 ) -> entry1 . getValue (). compareTo (
entry2 . getValue ());
Optional < Entry < Integer , String >> val = CANDY_BARS
. entrySet ()
. stream ()
. sorted ( byValue . reversed ())
. findFirst ();
logger . info ( val );
assertEquals ( "YORK PEPPERMINT PATTIE" , val . get (). getValue ());
}
Google Guava First lets define comparator using guava's fluent Ordering utility that will be used in the snippets below.
Ordering < Map . Entry < Integer , String >> byMapValues = new Ordering < Map . Entry < Integer , String >>() {
@Override
public int compare ( Map . Entry < Integer , String > left , Map . Entry < Integer , String > right ) {
return left . getValue (). compareTo ( right . getValue ());
}
};
Natural order This snippet will show how to sort a hashmap based on values using guava ordering comparator class.
@Test
public void sort_map_by_values_guava () {
// create a list of map entries
List < Map . Entry < Integer , String >> candyBars = Lists . newArrayList ( CANDY_BARS . entrySet ());
Collections . sort ( candyBars , byMapValues );
logger . info ( candyBars );
assertEquals ( "ALMOND JOY" , candyBars . get ( 0 ). getValue ());
}
Output
[
232=ALMOND JOY,
222=REESE'S P-BUTTER CUPS,
233=REESE'S P-BUTTER CUPS,
284=TWIX, CARAMEL,
149=YORK PEPPERMINT PATTIE
]
Reverse order Using the Ordering object created above, we will call the Ordering.reverse which will sort the map in descending order.
@Test
public void sort_map_by_values_guava_reverse () {
// create a list of map entries
List < Map . Entry < Integer , String >> candyBars = Lists . newArrayList ( CANDY_BARS . entrySet ());
Collections . sort ( candyBars , byMapValues . reverse ());
logger . info ( candyBars );
assertEquals ( "YORK PEPPERMINT PATTIE" , candyBars . get ( 0 ). getValue ());
}
Output
[
149=YORK PEPPERMINT PATTIE,
284=TWIX, CARAMEL,
222=REESE'S P-BUTTER CUPS,
233=REESE'S P-BUTTER CUPS,
232=ALMOND JOY
]
Sort map by value posted by Justin Musgrove on 07 November 2013
Tagged: java and java-collections
Share on: Facebook Google+
All the code on this page is available on github:
SortMapByValues.java