Si vous pouvez trier vos éléments à l'avance par l'attribut value, vous pouvez utiliser un LinkedListHashMap
, car cela préserve l'ordre que vous spécifiez. Cependant, cela semble un peu fragile, et ne convient pas si vous avez besoin d'ajouter plus d'éléments à la carte plus tard. L'alternative est de stocker les valeurs dans une liste, triées selon vos besoins, et d'utiliser la recherche binaire pour récupérer les éléments et trouver le point d'insertion pour les nouveaux éléments.
Vous pouvez même envelopper tout cela et le placer derrière une interface Map
.
La classe Collections fournit binarySearch. Voici un aperçu:
- Mettez votre classe de valeur dans une liste,
List<Value> values
.
- Implémentez une classe
Comparable<Value>
qui compare les valeurs à l'aide de l'attribut sur lequel vous souhaitez les trier. Utilisez le Comparator<Value>
pour trier la liste.
- Maintenant que la liste est triée, vous pouvez utiliser
Collections.binarySearch(values, aValue, Comparator<Value>)
pour trouver l'index de la valeur réelle. Notez que aValue n'est pas une valeur réelle - c'est une valeur avec les attributs définis pour fournir la clé, mais le reste n'est pas initialisé. La valeur aValue est utilisée uniquement pour contenir la clé de tri.
Dans le code
List<Value> values = new ArrayList<Values>();
// .. add values
values.add(new Value(key, data1, data2, etc..));
Comparator<Value> compValue = new Comparator<Value>() {
public int compare(Value v1, Value v2) {
return v1.getKey()>v2.getKey();
}
}
Collections.sort(values, compValue);
// now we can search on key
int index = Collections.binarySearch(values, new Value(keyTofind), valueComp);
Value foundValue = null; // value with the key may not be in the list
if (index>=0)
foundValue = values.get(index);
// we can also update the list
Value newValue = new Value(key, data, data2, etc...);
int insert = Collections.binarySearch(values, newValue, valueComp);
// insert will be negative
values.add((-insert)-1, newValue);
EDIT: Si vous enveloppez cela dans une interface cartographique, par exemple En prolongeant AbstractMap, il sera sérialisable.
Ty beaucoup mais maintenant cela a déclenché un autre problème. je ne peux pas désirialiser un hashmapmap, je n'ai eu aucun problème avec hashmap.so je posterai un autre questiong.Ty encore – weakwire