web-dev-qa-db-fra.com

Tri de hashmap basé sur des clés

J'ai le hashmap suivant en Java:

{B046 = 0.0, A061 = 3.0, A071 = 0.0, B085 = 0.0, B075 = 3.0, B076 = 9.0, B086 = 3.0, B095 = 0.0, B096 = 0.0, A052 = 0.0, B066 = 0.0, B056 = 9.0, B065 = 0.0, B055 = 9.0}

Comment dois-je procéder pour trier la table de hachage de sorte que l'alphabet, suivi des chiffres, soit pris en compte?

Le hashmap résultant devrait ressembler à ceci:

{A052 = 0.0, A061 = 3.0, A071 = 0.0, B046 = 0.0, B055 = 9.0, B056 = 9.0, B065 = 0.0, B066 = 0.0, B075 = 3.0, B076 = 9.0, B085 = 0.0, B086 = 3.0, B095 = 0.0, B096 = 0.0}

Appréciez l'aide!

69
user1008697

Utilisez la variable TreeMap triée:

Map<String, Float> map = new TreeMap<>(yourMap);

Il mettra automatiquement les entrées triées par clés. Je pense que la commande naturelle String ira bien dans votre cas.

Notez que HashMap en raison d'optimisations de recherche ne conserve pas l'ordre.

206
Tomasz Nurkiewicz

Utilisez une TreeMap avec un comparateur personnalisé.

class MyComparator implements Comparator<String>
    {
        public int compare(String o1,String o2)
        {
            // Your logic for comparing the key strings
        }
    }

TreeMap<String, Float> tm = new TreeMap<String , Float>(new MyComparator());

Au fur et à mesure que vous ajoutez de nouveaux éléments, ils seront automatiquement triés.

Dans votre cas, il peut même ne pas être nécessaire d'implémenter un comparateur car le classement des chaînes peut être suffisant. Mais si vous souhaitez implémenter des cas spéciaux, tels que les minuscules alphas avant les majuscules, ou traiter les nombres d’une certaine manière, utilisez le comparateur.

23
Kal

TreeMap est votre meilleur choix pour ce type de tri (naturel). TreeMap trie naturellement en fonction des clés.

HashMap ne préserve pas l'ordre d'insertion et ne trie pas la carte. LinkedHashMap conserve l'ordre d'insertion mais ne trie pas la carte automatiquement. Seule TreeMap dans l'interface Map trie la carte selon l'ordre naturel (chiffres en premier, alphabet en majuscule en second, alphabet en minuscule en dernier).

10
Roshnal

Utilisez un TreeMap , bien qu’avoir une carte "ressemblante" soit un peu nébuleuse - vous pouvez également trier les clés en fonction de vos critères et les parcourir sur la carte, en récupérant chaque objet.

5
Dave Newton

En utilisant le TreeMap vous pouvez trier la carte.

Map<String, String> map = new HashMap<String, String>();        
Map<String, String> treeMap = new TreeMap<String, String>(map);
//show hashmap after the sort
for (String str : treeMap.keySet()) {
    System.out.println(str);
}
3

Utilisez simplement une TreeMap. Il implémente l'interface SortedMap et trie donc automatiquement les clés qu'il contient. Vos clés peuvent simplement être triées par ordre alphabétique pour obtenir le résultat souhaité. Vous n'avez donc même pas besoin de fournir un comparateur.

Les hashmap ne sont jamais triés. La seule chose que vous puissiez faire avec un HashMap est de récupérer toutes les clés, de les stocker dans un ensemble trié ou dans une liste et de trier la liste.

3
JB Nizet

Vous pouvez utiliser TreeMap qui stockera les valeurs sous forme triée. 

Map <String, String> map = new TreeMap <String, String>();
3
Saurabh Prajapati

TreeMap va automatiquement trier par ordre croissant. Si vous souhaitez trier par ordre décroissant, utilisez le code suivant:

Copiez le code ci-dessous dans votre classe et en dehors de la méthode execute principale:

static class DescOrder implements Comparator<String> {
    @Override
    public int compare(String o1, String o2) {      
        return o2.compareTo(o1);
    }
    }

Alors dans votre logique:

TreeMap<String, String> map = new TreeMap<String, String>(new DescOrder());
map.put("A", "test1");
map.put("C", "test3");
map.put("E", "test5");
map.put("B", "test2");
map.put("D", "test4");
0
JavaGeek