Come ordinare una mappa di tre basata sui suoi valori?

Come posso ordinare una mappa dei tre utilizzando i suoi valori anziché la chiave?

Non è ansible in quanto il comparatore di TreeMap viene eseguito solo contro le chiavi, ad esempio consultare questo costruttore .

Ad ogni modo, è ansible utilizzare più raccolte, utilizzare la TreeMap (o meglio HashMap) per cercare elementi per chiavi e avere un SortedSet per iterare sui valori.

Ecco una soluzione:

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; } 

Si noti che la mappa è ordinata dal valore più alto al più basso.

Google Guava fornisce una TreeMultiMap .

Puoi anche utilizzare due raccolte. Cosa stai cercando di realizzare? Puoi spiegare i tuoi casi d’uso?

Apache Commons Collections ha una TreeBidiMap :

Questa class garantisce che la mappa sia in ordine crescente di chiave e in ordine crescente di valore, ordinata in base all’ordine naturale per le classi della chiave e del valore.

C’è una porta Java5-generica qui .

Prova sotto il codice funziona bene per me. È ansible scegliere sia l’ordine crescente che quello decrescente per l’ordinamento.

 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()); } } } 

Potresti provare a dare a un comparatore che confronta i valori anziché le chiavi quando crei 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()); } 

Scambia valori e chiavi.

Più seriamente, si prega di fornire un contesto che cosa si vuole raggiungere. Forse è abbastanza per ordinare dopo che l’altra elaborazione è finita.

Questo l’ho fatto ..

 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()); } }