Ordenar o HashMap em ordem alfabética por valor

Eu tenho um HashMap onde o Object é o ID do Student, e o Student é um object do Student.

Como posso recorrer ao HashMap pelo nome dos Alunos, student->getName() ?

Os HashMaps são intrinsecamente desordenados e não podem ser classificados.

Em vez disso, você pode usar uma implementação de SortedMap , como um TreeMap .
No entanto, até mesmo um mapa ordenado só pode classificar por suas chaves.

Se você quiser classificar pelos valores, precisará copiá-los para uma lista classificada.

Você pode não conseguir classificar um HashMap, mas certamente pode fazer algo que forneça o mesmo efeito. Eu era capaz de classificar o meu HashMap pelo valor descendente do Integer usando o excelente código postado no blog Javarevisited . O mesmo princípio se aplicaria a um object HashMap :

 /* * Java method to sort Map in Java by value eg HashMap or Hashtable * throw NullPointerException if Map contains null values * It also sort values even if they are duplicates */ public static  Map sortByValues(Map map){ List> entries = new LinkedList>(map.entrySet()); Collections.sort(entries, new Comparator>() { @Override public int compare(Entry o1, Entry o2) { return o1.getValue().compareTo(o2.getValue()); // to compare alphabetically case insensitive return this instead // o1.getValue().toString().compareToIgnoreCase(o2.getValue().toString()); } }); //LinkedHashMap will keep the keys in the order they are inserted //which is currently sorted on natural ordering Map sortedMap = new LinkedHashMap(); for(Map.Entry entry: entries){ sortedMap.put(entry.getKey(), entry.getValue()); } return sortedMap; } 

Para chamar esse método, eu uso:

 Map sorted = sortByValues(myOriginalHashMapObject); 

Leia mais: http://javarevisited.blogspot.com/2012/12/how-to-sort-hashmap-java-by-key-and-value.html#ixzz2akXStsGj

Mapas não podem ser ordenados por valores. Você pode fazer isso, no entanto:

 Collection students = map.values(); Collection.sort(new ArrayList(students)), new Comparator() { public int compare(Student s1, Student s2) { return s1.getName().compareTo(s2.getName()); } }); 

Assumindo, claro, que você precisa iterar sobre os valores. (Por que mais você quer que seja encomendado assim?)

Boa sorte.

Os HashMaps não podem ser classificados por seus valores. Um mapa é projetado para consultas de tempo constante com base na chave, portanto, a ordenação por valores não deve ser necessária. Se você precisar classificar por nome, sugiro usar um SortedSet e criar um comparador que classifique pelos nomes.

 class StudentComparator implements Comparator { int compare(Student s1, Student s2) { return s1.getName().compareTo(s2.getName()); } } 

Se você precisar de uma pesquisa de tempo constante e de um conjunto classificado por valor, talvez seja necessário manter um mapa e um conjunto.

Eu definitivamente usaria uma Nova Classe que armazenaria a chave e o Objeto.

Então você pode colocar todos os elementos do Map em um ArrayList na forma dessa class, e finalmente usar um comparador para ordenar o ArrayList, depois você simplesmente constrói um novo Map. Código será algo assim:

 Map valueMap = new LinkedHashMap(); List pairValueList = new ArrayList(); PairValue p; for (Map.Entry entry : map.entrySet()) { Object key = entry.getKey(); Student value = entry.getValue(); p = new PairValue(key, value); pairValueList.add(p); } Collections.sort(pairValueList, new Comparator() { @Override public int compare(PairValue c1, PairValue c2) { return c1.getLabel().compareTo(c2.getLabel()); } }); for (PairValue pv : pairValueList) { valueMap.put(pv.getValue(), pv.getStudent()); } 

A class PairValue

  class PairValue { private Object value; private Student student; public PairValue(Object value, String student) { this.value = value; this.student= student; } public String getValue() { return value; } public String getStudent() { return student; } } 

Foi assim que resolvi um problema parecido que tive no passado. Observe que a implementação do mapa retornado precisa ser um LinkedHashMap.