web-dev-qa-db-fra.com

Carte ordonnée par Java

En Java, existe-t-il un objet agissant comme une carte pour stocker et accéder aux paires clé/valeur, mais pouvant renvoyer une liste ordonnée de clés et une liste ordonnée de valeurs, telles que les listes de clés et de valeurs soient dans le même ordre?

Donc, comme explication par code, je cherche quelque chose qui se comporte comme mon fictif OrderedMap:

OrderedMap<Integer, String> om = new OrderedMap<>();
om.put(0, "Zero");
om.put(7, "Seven");

String o = om.get(7); // o is "Seven"
List<Integer> keys = om.getKeys();
List<String> values = om.getValues();

for(int i = 0; i < keys.size(); i++)
{
    Integer key = keys.get(i);
    String value = values.get(i);
    Assert(om.get(key) == value);
}
261
Whatsit

Le SortedMap interface (avec la mise en œuvre TreeMap ) devrait être votre ami.

L'interface a les méthodes:

  • keySet() qui retourne un jeu de clés dans l'ordre croissant
  • values() qui renvoie une collection de toutes les valeurs dans l'ordre croissant des clés correspondantes

Cette interface répond donc exactement à vos exigences. Cependant, les clés doivent avoir un ordre significatif. Sinon, vous pouvez utiliser LinkedHashMap où l'ordre est déterminé par l'ordre d'insertion.

337
dmeister

Existe-t-il un objet agissant comme une carte pour stocker et accéder aux paires clé/valeur, mais pouvant renvoyer une liste ordonnée de clés et une liste ordonnée de valeurs, telles que les listes de clés et de valeurs soient dans le même ordre?

Vous recherchez Java.util.LinkedHashMap . Vous obtiendrez une liste de cartes.Entrée <K, V> , qui sont toujours itérées dans le même ordre. . Cet ordre est le même que celui dans lequel vous avez placé les éléments. Vous pouvez également utiliser Java.util.SortedMap , où les clés doivent soit avoir ordre naturel, soit être spécifiées par Comparator.

196
John Feminella

LinkedHashMap conserve l'ordre des clés.

Java.util.LinkedHashMap semble fonctionner exactement comme un HashMap normal.

14
VoNWooDSoN

Je pense que la collection la plus proche que vous obtiendrez du cadre est la SortedMap

6
bruno conde

Vous pouvez utiliser NavigableMap interface accessible et parcourue dans l'ordre croissant ou décroissant. Cette interface est destinée à remplacer l’interface SortedMap. La carte navigable est généralement triée en fonction de l'ordre naturel de ses clés ou d'un comparateur fourni au moment de la création de la carte.

Il existe trois implémentations les plus utiles: TreeMap , ImmutableSortedMap , et ConcurrentSkipListMap

Exemple TreeMap:

TreeMap<String, Integer> users = new TreeMap<String, Integer>();
users.put("Bob", 1);
users.put("Alice", 2);
users.put("John", 3);

for (String key: users.keySet()) {
  System.out.println(key + " (ID = "+ users.get(key) + ")");
}

Sortie:

Alice (ID = 2)
Bob (ID = 1)
John (ID = 3)
4
Vitalii Fedorenko

Je pense que l'interface SortedMap applique ce que vous demandez et TreeMap l'implémente. 

http://Java.Sun.com/j2se/1.5.0/docs/api/Java/util/SortedMap.htmlhttp://Java.Sun.com/j2se/1.5. 0/docs/api/Java/util/TreeMap.html

3
CJ F

Depuis Java 6, il existe également une alternative non bloquante thread-safe à TreeMap . Voir ConcurrentSkipListMap .

3
Vadzim

J'ai utilisé Carte de hachage simple, liste chaînée et Collections pour trier une carte par valeurs.

import Java.util.*;
import Java.util.Map.*;
public class Solution {

    public static void main(String[] args) {
        // create a simple hash map and insert some key-value pairs into it
        Map<String, Integer> map = new HashMap<String, Integer>();
        map.put("Python", 3);
        map.put("C", 0);
        map.put("JavaScript", 4);
        map.put("C++", 1);
        map.put("Golang", 5);
        map.put("Java", 2);
        // Create a linked list from the above map entries
        List<Entry<String, Integer>> list = new LinkedList<Entry<String, Integer>>(map.entrySet());
        // sort the linked list using Collections.sort()
        Collections.sort(list, new Comparator<Entry<String, Integer>>(){
        @Override
         public int compare(Entry<String, Integer> m1, Entry<String, Integer> m2) {
        return m1.getValue().compareTo(m2.getValue());
        }
      });
      for(Entry<String, Integer> value: list) {
         System.out.println(value);
     }
   }
}

La sortie est:

C=0
C++=1
Java=2
Python=3
JavaScript=4
Golang=5
0