package mightypork.utils; import java.util.Collections; import java.util.Comparator; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; /** * Map sorting utils * * @author Ondřej Hruška (MightyPork) */ public class MapSort { /** * Sort a map by keys, maintaining key-value pairs, using natural order. * * @param map map to be sorted * @return linked hash map with sorted entries */ @SuppressWarnings({ "rawtypes" }) public static LinkedHashMap byKeys(Map map) { return byKeys(map, null); } /** * Sort a map by keys, maintaining key-value pairs. * * @param map map to be sorted * @param comparator a comparator, or null for natural ordering * @return linked hash map with sorted entries */ @SuppressWarnings({ "unchecked" }) public static LinkedHashMap byKeys(Map map, Comparator comparator) { final List keys = new LinkedList<>(map.keySet()); if (comparator == null) { comparator = new Comparator() { @Override public int compare(K arg0, K arg1) { return ((Comparable) arg0).compareTo(arg1); } }; } Collections.sort(keys, comparator); final LinkedHashMap sortedMap = new LinkedHashMap<>(); for (final K key : keys) { sortedMap.put(key, map.get(key)); } return sortedMap; } /** * Sort a map by values, maintaining key-value pairs, using natural order. * * @param map map to be sorted * @return linked hash map with sorted entries */ @SuppressWarnings("rawtypes") public static LinkedHashMap byValues(Map map) { return byValues(map, null); } /** * Sort a map by values, maintaining key-value pairs. * * @param map map to be sorted * @param comparator a comparator, or null for natural ordering * @return linked hash map with sorted entries */ public static LinkedHashMap byValues(Map map, final Comparator comparator) { final List> entries = new LinkedList<>(map.entrySet()); Collections.sort(entries, new Comparator>() { @SuppressWarnings("unchecked") @Override public int compare(Entry o1, Entry o2) { if (comparator == null) return ((Comparable) o1.getValue()).compareTo(o2.getValue()); return comparator.compare(o1.getValue(), o2.getValue()); } }); final LinkedHashMap sortedMap = new LinkedHashMap<>(); for (final Map.Entry entry : entries) { sortedMap.put(entry.getKey(), entry.getValue()); } return sortedMap; } }