¿Cómo puedo ordenar un treemap usando sus valores en lugar de la clave?¿Cómo ordenar un treemap basado en sus valores?
Respuesta
No se puede, ya que el comparador TreeMap se ejecuta solo con las teclas, p. vea esto constructor.
De todos modos, puede usar varias Colecciones, usar TreeMap (o más bien HashMap) para buscar elementos por claves, y tener SortedSet para repetir los valores.
Cambie los valores y las claves.
Más en serio, por favor proporcione un contexto de lo que quiere lograr. Tal vez sea suficiente para ordenar después de que haya terminado otro procesamiento.
¿cómo puedo intercambiarlos? –
Quiere decir que debe usar lo que esté usando como clave ahora como el valor, y viceversa. De esta forma puede ordenar su valor, que ahora es la clave. – Jorn
Este es generalmente un enfoque pobre ya que el mapa tiene claves únicas (con respecto a compareTo) pero no necesariamente valores únicos. Crear un nuevo mapa con las claves intercambiadas con valores puede proporcionarle un conjunto de datos diferente. – Buhb
Puede intentar dar un Comparador que compare los valores en lugar de las claves al crear el Árbol de mapa.
final TreeMap<Integer,String> tree = new TreeMap<Integer,String>();
tree.put(1, "1");
tree.put(2, "2");
tree.put(3, "3");
tree.put(4, "4");
final TreeMap<Integer,String> treeSortedByValues = new TreeMap<Integer,String>(new Comparator<Integer>()
{
public int compare(Integer o1, Integer o2)
{
return tree.get(o1).compareTo(tree.get(o2));
}
});
treeSortedByValues.putAll(tree);
for (Entry<Integer, String> e : treeSortedByValues.entrySet())
{
System.out.println(e.getKey() + ": " + e.getValue());
}
Apache Commons Collections tiene un TreeBidiMap:
Esto garantiza la clase que el mapa será tanto para y el valor ascendente orden de las teclas ascendente, ordenados de acuerdo con el orden natural de la clave de y clases de valor.
Hay un puerto genérico Java5 here.
El enlace está roto –
Google Collections proporciona un TreeMultiMap.
También podría usar dos colecciones. ¿Qué está tratando de lograr? ¿Puedes explicar tus casos de uso?
Aquí es una solución:
public static <K, V extends Comparable<V>> Map<K, V> sortByValues(final Map<K, V> map) {
Comparator<K> valueComparator = new Comparator<K>() {
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<K, V> sortedByValues = new TreeMap<K, V>(valueComparator);
sortedByValues.putAll(map);
return sortedByValues;
}
Tenga en cuenta que el mapa se ordena desde el valor más alto al más bajo.
Estoy obteniendo una excepción de stackoverflow con este método – superrache
¡esto en realidad no funciona!a menos que todos los datos estén en el mapa original 'Map
Probar debajo de 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<String, Integer> unsortMap = new HashMap<String, Integer>();
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<String, Integer> sortedMapAsc = sortByComparator(unsortMap, ASC);
printMap(sortedMapAsc);
System.out.println("After sorting descindeng order......");
Map<String, Integer> sortedMapDesc = sortByComparator(unsortMap, DESC);
printMap(sortedMapDesc);
}
private static Map<String, Integer> sortByComparator(Map<String, Integer> unsortMap, final boolean order)
{
List<Entry<String, Integer>> list = new LinkedList<Entry<String, Integer>>(unsortMap.entrySet());
// Sorting the list based on values
Collections.sort(list, new Comparator<Entry<String, Integer>>()
{
public int compare(Entry<String, Integer> o1,
Entry<String, Integer> 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<String, Integer> sortedMap = new LinkedHashMap<String, Integer>();
for (Entry<String, Integer> entry : list)
{
sortedMap.put(entry.getKey(), entry.getValue());
}
return sortedMap;
}
public static void printMap(Map<String, Integer> map)
{
for (Entry<String, Integer> entry : map.entrySet())
{
System.out.println("Key : " + entry.getKey() + " Value : "+ entry.getValue());
}
}
}
Eso es que he hecho esto ..
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<Object> {
public int compare(Object o1, Object o2) {
return (((Integer) o2).compareTo((Integer) o1));
}
}
class MyComparator1 implements Comparator<Object> {
Map<Integer, String> map;
public MyComparator1(Map<Integer, String> 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<Integer, String> hmap = new HashMap<Integer, String>();
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<Integer, String> tmap = new TreeMap<>(hmap);
System.out.println("Tree Map:" + tmap);
MyComparator comp = new MyComparator();
Map<Integer, String> itmap = new TreeMap<>(comp);
itmap.putAll(hmap);
System.out.println("Tree Map Inreverse order:" + itmap);
Map<Integer, String> orderValuemap = new TreeMap<Integer, String>(new
MyComparator1(hmap));
orderValuemap.putAll(hmap);
orderValuemap.put(22,"hello");
for(Entry<Integer, String> mp:orderValuemap.entrySet())
System.out.println("Value : "+mp.getValue());
}
}
- 1. cómo ordenar un scala.collection.Map [java.lang.String, Int] por sus valores?
- 2. Ordenar elementos en un hash anidado por sus valores
- 3. Cómo filtrar claves de diccionario basado en sus valores correspondientes
- 4. Ordenación de las claves de diccionario basado en sus valores
- 5. ¿Cómo imprimiría todos los valores en un TreeMap?
- 6. ¿Cómo iterar sobre un TreeMap?
- 7. Ordenar un ArrayList basado en un campo de objeto
- 8. Django: ordenar modelo basado en la diferencia entre dos de sus campos
- 9. Clasificación: Ordenar un array basado en múltiples condiciones en Ruby
- 10. ordenar un vector de puntos basado en otro vector
- 11. cómo ordenar basado en una columna pero uniq basado en otra columna?
- 12. cómo ordenar Tlistview basado en el subelemento [x]
- 13. Ordenar con valores numéricos
- 14. Treemap en Python
- 15. Visual Treemap en Winforms
- 16. ¿Un entrySet() de TreeMap devuelve un TreeSet
- 17. Ordenando XML en XSLT basado en una lista de valores
- 18. reemplazar valores en un vector basado en otro vector
- 19. ¿Cómo inicializar un TreeMap con datos ordenados previamente?
- 20. Cómo ordenar valores a través de XPath
- 21. Ruby ordenar por valores múltiples?
- 22. ¿Debo usar Double as keys en TreeMap?
- 23. ¿Cómo obtengo el nodo raíz de un TreeMap en Java?
- 24. Usando conteo Ordenar en valores negativos?
- 25. Ordenar matrices PHP basadas en valores duplicados
- 26. python numpy ordenar valores propios
- 27. Java TreeMap equivalente en C#?
- 28. Ordenar una matriz bidimensional basado en una columna
- 29. ¿Cómo ordenar los valores en columnas y actualizar la tabla?
- 30. ¿Cómo ordenar una búsqueda?
La primera solución en este enlace es el mejor que puede haber. http://stackoverflow.com/questions/2864840/treemap-sort-by-value –