En Java, existe-t-il un objet qui agit comme une carte pour stocker et accéder aux paires clé / valeur, mais peut renvoyer une liste ordonnée de clés et une liste ordonnée de valeurs, de sorte que les listes de clés et de valeurs soient dans le même ordre?
Donc, en tant qu'explication par code, je cherche quelque chose qui se comporte comme mon OrderedMap fictif:
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);
}
java
collections
Qu'est ce que c'est
la source
la source
LinkedHashMap
.Réponses:
L' interface SortedMap (avec l'implémentation TreeMap ) devrait être votre ami.
L'interface a les méthodes:
keySet()
qui renvoie un ensemble de clés dans l'ordre croissantvalues()
qui retourne une collection de toutes les valeurs dans l'ordre croissant des clés correspondantesCette interface répond donc exactement à vos besoins. Cependant, les clés doivent avoir un ordre significatif. Sinon, vous pouvez utiliser le LinkedHashMap où l'ordre est déterminé par l'ordre d'insertion.
la source
LinkedHashMap
dont l'ordre d'itération est l' ordre dans lequel ses entrées ont été consultées pour la dernière foisLinkedHashMap
, l'ordre d'itération est l'ordre d'insertion, mais vous pouvez utiliser un constructeur différent pour spécifier à la place l'ordre d'accès. docs.oracle.com/javase/8/docs/api/java/util/…Vous recherchez java.util.LinkedHashMap . Vous obtiendrez une liste de paires Map.Entry <K, V> , qui sont toujours itérées dans le même ordre. Cet ordre est le même que l'ordre dans lequel vous placez les éléments. Vous pouvez également utiliser java.util.SortedMap , où les clés doivent avoir un ordre naturel ou le spécifier par un
Comparator
.la source
keySet()
méthode renvoie efficacement un LinkedHashSet qui reflète l'ordre de vosput()
appels. Notez que les appels répétés àput()
la même clé ne changeront pas l'ordre sauf si vous avezremove()
préalablement la clé.LinkedHashMap
dont l'ordre d'itération est l' ordre dans lequel ses entrées ont été consultées pour la dernière foisLinkedHashMap maintient l'ordre des clés.
java.util.LinkedHashMap semble fonctionner comme un HashMap normal dans le cas contraire.
la source
Je pense que la collection la plus proche que vous obtiendrez du cadre est le SortedMap
la source
Vous pouvez tirer parti de l' interface NavigableMap qui peut être consultée et parcourue dans l'ordre croissant ou décroissant des clés. 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 par 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:
Production:
la source
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.html http://java.sun.com/j2se/1.5.0/docs/api/java/util /TreeMap.html
la source
Depuis Java 6, il existe également une alternative thread-safe non bloquante à TreeMap . Voir ConcurrentSkipListMap .
la source
tl; dr
Pour conserver
Map< Integer , String >
un ordre trié par clé, utilisez l'une des deux classes implémentant les interfacesSortedMap
/NavigableMap
:TreeMap
ConcurrentSkipListMap
Si vous manipulez la carte dans un seul thread, utilisez le premier
TreeMap
,. Si vous manipulez sur des threads, utilisez le secondConcurrentSkipListMap
,.Pour plus de détails, consultez le tableau ci-dessous et la discussion suivante.
Détails
Voici un tableau graphique que j'ai fait montrant les fonctionnalités des dix
Map
implémentations fournies avec Java 11.L'
NavigableMap
interface est ce quiSortedMap
aurait dû être en premier lieu. LaSortedMap
logique devrait être supprimée mais ne peut pas l'être car certaines implémentations de cartes tierces peuvent utiliser l'interface.Comme vous pouvez le voir dans ce tableau, seules deux classes implémentent les interfaces
SortedMap
/NavigableMap
:TreeMap
ConcurrentSkipListMap
Ces deux conservent les clés dans l'ordre trié, soit par leur ordre naturel (en utilisant la
compareTo
méthode duComparable
( https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ Comparable.html ) ou par uneComparator
implémentation que vous passez. La différence entre ces deux classes est que la secondeConcurrentSkipListMap
, est thread-safe , hautement concurrente .Voir également la colonne Ordre d'itération dans le tableau ci-dessous.
LinkedHashMap
classe renvoie ses entrées par l'ordre dans lequel elles ont été insérées à l'origine .EnumMap
renvoie les entrées dans l'ordre dans lequel la classe d'énumération de la clé est définie . Par exemple, une carte indiquant quel employé couvre quel jour de la semaine (Map< DayOfWeek , Person >
) utilise laDayOfWeek
classe enum intégrée à Java. Cette énumération est définie avec lundi premier et dimanche dernier. Les entrées d'un itérateur apparaîtront donc dans cet ordre.Les six autres implémentations ne font aucune promesse quant à l'ordre dans lequel elles signalent leurs entrées.
la source
J'ai utilisé la carte Simple Hash, la liste chaînée et les collections pour trier une carte par valeurs.
La sortie est:
la source