package com.levelup.java.collections;
import static org.hamcrest.collection.IsIterableContainingInOrder.contains;
import static org.junit.Assert.assertThat;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;
import java.util.stream.Collectors;
import org.apache.log4j.Logger;
import org.junit.Before;
import org.junit.Test;
import com.google.common.collect.Ordering;
/**
* This example will demonstrate sorting a map by keys in java. For calories
* burned it will assume you were 200 pounds and performed the activity for 30
* minutes. The conversion was provided by
* http://www.myfitnesspal.com/exercise/lookup.
*
* @author Justin Musgrove
* @see <a href=
* 'http://www.leveluplunch.com/java/examples/sort-order-map-by-key/'>Sort
* map by key</a>
*
*/
public class SortMapByKeys {
private static final Logger logger = Logger.getLogger(SortMapByKeys.class);
Map<Integer, String> CALORIES_BURNED;
@Before
public void setUp() {
CALORIES_BURNED = new HashMap<Integer, String>();
CALORIES_BURNED.put(295, "Race walking");
CALORIES_BURNED.put(249, "Punching bag");
CALORIES_BURNED.put(499, "Rock climbing, ascending rock");
CALORIES_BURNED.put(726, "Running (jogging), 10 mph (6 min mile)");
CALORIES_BURNED.put(281, "Shoveling snow");
}
@Test
public void sort_map_by_key_java() {
TreeMap<Integer, String> caloriesBurnedSorted = new TreeMap<Integer, String>(
CALORIES_BURNED);
logger.info(caloriesBurnedSorted);
assertThat(caloriesBurnedSorted.keySet(),
contains(249, 281, 295, 499, 726));
}
@Test
public void sort_map_by_key_java_reverse() {
TreeMap<Integer, String> caloriesBurnedReverse = new TreeMap<Integer, String>(
Collections.reverseOrder());
caloriesBurnedReverse.putAll(CALORIES_BURNED);
logger.info(caloriesBurnedReverse);
assertThat(caloriesBurnedReverse.keySet(),
contains(726, 499, 295, 281, 249));
}
@Test
public void sort_map_by_key_java8() {
Map<Integer, String> sortedMapByKey = CALORIES_BURNED
.entrySet()
.stream()
.sorted(Map.Entry.comparingByKey())
.peek(System.out::println)
.collect(
Collectors.toMap(Map.Entry::getKey,
Map.Entry::getValue, (v1, v2) -> v1, // BinaryOperator
// merge
// function
LinkedHashMap::new));
assertThat(sortedMapByKey.keySet(), contains(249, 281, 295, 499, 726));
}
@Test
public void sort_map_by_key_guava() {
TreeMap<Integer, String> caloriesBurnedReverse = new TreeMap<Integer, String>(
Ordering.natural().reverse());
caloriesBurnedReverse.putAll(CALORIES_BURNED);
logger.info(caloriesBurnedReverse);
assertThat(caloriesBurnedReverse.keySet(),
contains(726, 499, 295, 281, 249));
}
}