¿Cómo ordenar los valores del mapa por clave en Java?




6 Answers

Asumir que TreeMap no es bueno para usted (y suponiendo que no puede usar genéricos):

List sortedKeys=new ArrayList(yourMap.keySet());
Collections.sort(sortedKeys);
// Do what you need with sortedKeys.
java dictionary hashmap

Tengo un mapa que tiene cadenas tanto para claves como para valores.

Los datos son como los siguientes:

"pregunta 1", "1"
"pregunta 9", "1"
"pregunta 2", "4"
"pregunta 5", "2"

Quiero ordenar el mapa en función de sus claves. Entonces, al final, tendré la question1, question2, question3 ... y así sucesivamente.


Finalmente, estoy tratando de obtener dos cadenas de este mapa.

  • Primera Cadena: Preguntas (en orden 1 ..10)
  • Segunda cadena: Respuestas (en el mismo orden que la pregunta)

Ahora mismo tengo lo siguiente:

Iterator it = paramMap.entrySet().iterator();
while (it.hasNext()) {
    Map.Entry pairs = (Map.Entry) it.next();
    questionAnswers += pairs.getKey() + ",";
}

Esto me pone las preguntas en una cadena pero no están en orden.







Solo usa TreeMap

new TreeMap<String, String>(unsortMap);

Tenga en cuenta que el TreeMap se clasifica de acuerdo con el orden natural de sus 'claves'




Este código puede ordenar un mapa clave-valor en ambos órdenes, es decir, ascendente y descendente.

<K, V extends Comparable<V>> Map<K, V> sortByValues
     (final Map<K, V> map, int ascending)
{
     Comparator<K> valueComparator =  new Comparator<K>() {         
        private int ascending;
        public int compare(K k1, K k2) {
            int compare = map.get(k2).compareTo(map.get(k1));
            if (compare == 0) return 1;
            else return ascending*compare;
        }
        public Comparator<K> setParam(int ascending)
        {
            this.ascending = ascending;
            return this;
        }
    }.setParam(ascending);

    Map<K, V> sortedByValues = new TreeMap<K, V>(valueComparator);
    sortedByValues.putAll(map);
    return sortedByValues;
}

Como ejemplo:

Map<Integer,Double> recommWarrVals = new HashMap<Integer,Double>();
recommWarrVals = sortByValues(recommWarrVals, 1);  // Ascending order
recommWarrVals = sortByValues(recommWarrVals,-1);  // Descending order



En java 8

Para ordenar un Map<K, V> por clave, coloque las claves en una List<K> :

List<K> result = map.keySet().stream().sorted().collect(Collectors.toList());

Para ordenar un Map<K, V> por clave, List<Map.Entry<K, V>> entradas en una List<Map.Entry<K, V>> :

List<Map.Entry<K, V>> result =
    map.entrySet()
       .stream()
       .sorted(Map.Entry.comparingByKey())
       .collect(Collectors.toList());

Por último, pero no menos importante: para ordenar las cadenas de una manera sensible al entorno local, use una Collator (comparador):

Collator collator = Collator.getInstance(Locale.US);
collator.setStrength(Collator.PRIMARY); // case insensitive collator

List<Map.Entry<String, String>> result =
    map.entrySet()
       .stream()
       .sorted(Map.Entry.comparingByKey(collator))
       .collect(Collectors.toList());



También podemos ordenar la clave utilizando el método Arrays.sort.

Map<String, String> map = new HashMap<String, String>();
Object[] objArr = new Object[map.size()];
for (int i = 0; i < map.size(); i++) {
objArr[i] = map.get(i);
}
Arrays.sort(objArr);
for (Object str : objArr) {
System.out.println(str);
}



Related