¿Cómo ordenar un treemap basado en sus valores?

¿Cómo puedo ordenar un treemap usando sus valores en lugar de la clave?

No se puede, ya que el comparador TreeMap se ejecuta contra las teclas solamente, por ejemplo, ver este constructor .

De todos modos, puede usar varias Colecciones, usar TreeMap (o más bien HashMap) para buscar elementos por claves, y tener un SortedSet para iterar en los valores.

Aquí hay una solución:

public static > Map sortByValues(final Map map) { Comparator valueComparator = new Comparator() { public int compare(K k1, K k2) { int compare = map.get(k2).compareTo(map.get(k1)); if (compare == 0) return 1; else return compare; } }; Map sortedByValues = new TreeMap(valueComparator); sortedByValues.putAll(map); return sortedByValues; } 

Tenga en cuenta que el mapa está ordenado desde el valor más alto al más bajo.

Google Guava proporciona un TreeMultiMap .

También puedes usar dos colecciones. ¿Qué está tratando de lograr? ¿Puedes explicar tus casos de uso?

Las Colecciones de Apache Commons tienen un TreeBidiMap :

Esta clase garantiza que el mapa estará en orden de orden ascendente y en orden de valor ascendente, ordenados de acuerdo con el orden natural de las clases de clave y valor.

Aquí hay un puerto de generics Java5.

Prueba el siguiente código, funciona bien para mí. Puede elegir tanto el orden ascendente como el descendente para la clasificación.

 package com.rais; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; public class SortMapByValue { public static boolean ASC = true; public static boolean DESC = false; public static void main(String[] args) { // Creating dummy unsorted map Map unsortMap = new HashMap(); unsortMap.put("B", 55); unsortMap.put("A", 80); unsortMap.put("D", 20); unsortMap.put("C", 70); System.out.println("Before sorting......"); printMap(unsortMap); System.out.println("After sorting ascending order......"); Map sortedMapAsc = sortByComparator(unsortMap, ASC); printMap(sortedMapAsc); System.out.println("After sorting descindeng order......"); Map sortedMapDesc = sortByComparator(unsortMap, DESC); printMap(sortedMapDesc); } private static Map sortByComparator(Map unsortMap, final boolean order) { List> list = new LinkedList>(unsortMap.entrySet()); // Sorting the list based on values Collections.sort(list, new Comparator>() { public int compare(Entry o1, Entry o2) { if (order) { return o1.getValue().compareTo(o2.getValue()); } else { return o2.getValue().compareTo(o1.getValue()); } } }); // Maintaining insertion order with the help of LinkedList Map sortedMap = new LinkedHashMap(); for (Entry entry : list) { sortedMap.put(entry.getKey(), entry.getValue()); } return sortedMap; } public static void printMap(Map map) { for (Entry entry : map.entrySet()) { System.out.println("Key : " + entry.getKey() + " Value : "+ entry.getValue()); } } } 

Podría intentar dar un Comparador que compare los valores en lugar de las claves cuando cree TreeMap.

  final TreeMap tree = new TreeMap(); tree.put(1, "1"); tree.put(2, "2"); tree.put(3, "3"); tree.put(4, "4"); final TreeMap treeSortedByValues = new TreeMap(new Comparator() { public int compare(Integer o1, Integer o2) { return tree.get(o1).compareTo(tree.get(o2)); } }); treeSortedByValues.putAll(tree); for ( Entry e : treeSortedByValues.entrySet() ) { System.out.println(e.getKey() + ": " + e.getValue()); } 

Cambiar valores y claves.

Más en serio, proporcione algún contexto de lo que quiere lograr. Tal vez sea suficiente para ordenar después de que haya terminado otro procesamiento.

Eso es lo que hice …

 package Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.TreeMap; class MyComparator implements Comparator { public int compare(Object o1, Object o2) { return (((Integer) o2).compareTo((Integer) o1)); } } class MyComparator1 implements Comparator { Map map; public MyComparator1(Map m) { this.map = m; } public int compare(Object o1, Object o2) { return (((String) map.get(o1)).compareTo((String) map.get(o2))); } } public class Map1 { public static void main(String[] args) { Map hmap = new HashMap(); hmap.put(5, "Ashok"); hmap.put(21, "Bhanu"); hmap.put(7, "chaman"); hmap.put(28, "dheeraj"); hmap.put(761, "edison"); hmap.put(1, "frank"); hmap.put(-6, "gopal"); hmap.put(78, "hari"); System.out.println("Hash Map:" + hmap); Map tmap = new TreeMap<>(hmap); System.out.println("Tree Map:" + tmap); MyComparator comp = new MyComparator(); Map itmap = new TreeMap<>(comp); itmap.putAll(hmap); System.out.println("Tree Map Inreverse order:" + itmap); Map orderValuemap = new TreeMap(new MyComparator1(hmap)); orderValuemap.putAll(hmap); orderValuemap.put(22,"hello"); for(Entry mp:orderValuemap.entrySet()) System.out.println("Value : "+mp.getValue()); } }