package com.levelup.java.collections;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Optional;
import org.apache.log4j.Logger;
import org.junit.Before;
import org.junit.Test;
import com.google.common.collect.Lists;
import com.google.common.collect.Ordering;
/**
* This example will demonstrate how to sort or
* order a map by its value. The demonstration
* will use a map keyed by calories and value is
* the type of candy bar.
*
* @author Justin Musgrove
* @see <a href='http://www.leveluplunch.com/java/examples/sort-order-map-by-values/'>Sort map by value</a>
*
*/
public class SortMapByValues {
private static final Logger logger = Logger.getLogger(SortMapByValues.class);
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");
}
@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());
}
@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());
}
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());
}
};
@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());
}
@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());
}
}