How to sort a Map<Key, Value> on the values in Java?
I am relatively new to Java, and often find that I need to sort a Map on the values. Since the values are not unique, I find myself converting the keySet into an array, and sorting that array through array sort with a custom comparator that sorts on the value associated with the key. Is there an easier way?
answer is below.
package com.powenko.Tutorial_Fun_HashMap; import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; import android.app.Activity; import android.os.Bundle; public class Tutorial_Fun_HashMapActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); /////// Map<String, String> map = new HashMap<String, String>(); map.put("Cde", "C"); map.put("Abc", "A"); map.put("Cbc", "Z"); map.put("Dbc", "D"); map.put("Bcd", "B"); map.put("sfd", "Bqw"); map.put("DDD", "Bas"); map.put("BGG", "Basd"); System.out.println(sort(map, new Comparator<String>() { @Override public int compare(String o1, String o2) { return o1.compareTo(o2); }})); String t1=map.get("BGG"); String t2=map.get("Abc"); } @SuppressWarnings("unchecked") public static <K, V> Map<K,V> sort(Map<K, V> in, Comparator<? super V> compare) { Map<K, V> result = new LinkedHashMap<K, V>(); V[] array = (V[])in.values().toArray(); for(int i=0;i<array.length;i++) { } Arrays.sort(array, compare); for (V item : array) { K key= (K) getKey(in, item); result.put(key, item); } return result; } public static <K, V> Object getKey(Map<K, V> in,V value) { Set<K> key= in.keySet(); Iterator<K> keyIterator=key.iterator(); while (keyIterator.hasNext()) { K valueObject = (K) keyIterator.next(); if(in.get(valueObject).equals(value)) { return valueObject; } } return null; } }
sample code:
Tutorial_Fun_HashMap