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);
}
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 croissantvalues()
qui renvoie une collection de toutes les valeurs dans l'ordre croissant des clés correspondantesCette 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.
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
.
LinkedHashMap conserve l'ordre des clés.
Java.util.LinkedHashMap semble fonctionner exactement comme un HashMap normal.
Je pense que la collection la plus proche que vous obtiendrez du cadre est la SortedMap
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)
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
Depuis Java 6, il existe également une alternative non bloquante thread-safe à TreeMap . Voir ConcurrentSkipListMap .
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