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