Se è possibile ordinare in anticipo gli elementi in base all'attributo valore, è possibile utilizzare uno LinkedListHashMap
, poiché conserva l'ordine specificato. Tuttavia, questo sembra un po 'fragile e non è adatto se è necessario aggiungere più elementi alla mappa.
L'alternativa consiste nel memorizzare i valori in un elenco, ordinati in base alle necessità, e utilizzare la ricerca binaria per recuperare gli elementi e trovare il punto di inserimento per i nuovi elementi.
Si può anche avvolgere tutto questo e metterlo dietro un'interfaccia Map
.
La classe Raccolte fornisce binarySearch. Ecco uno schema:
- Inserisci la classe Value in un elenco,
List<Value> values
.
- Implementare una classe
Comparable<Value>
che confronta i valori utilizzando l'attributo su cui si desidera ordinarli.
- Utilizzare
Comparator<Value>
per ordinare l'elenco.
- Ora che l'elenco è ordinato, è possibile utilizzare
Collections.binarySearch(values, aValue, Comparator<Value>)
per trovare l'indice del valore effettivo. Nota che aValue non è un valore reale: è un valore con gli attributi impostati per fornire la chiave, ma il resto è privo di pubblicità. L'aValue viene utilizzato solo per contenere la chiave di ordinamento.
Nel codice
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: Se avvolgere questo in un'interfaccia mappa, per esempio estendendo AbstractMap, sarà serializzabile.
Ty molto, ma ora che ha provocato un altro problema. non riesco a desirializzare una linkhashmap, non ho avuto problemi con hashmap.so pubblicherò un altro questiong.Ty di nuovo – weakwire