2010-05-22 1 views

risposta

4

Vediamo. I tuoi requisiti sembrano essere:

  1. Si dispone di un set di coppie chiave/valore, in cui i tasti sono univoci.
  2. Si desidera essere in grado di eseguire una ricerca rapida del valore per una determinata chiave.
  3. Si desidera essere in grado di scorrere i tasti (o le coppie) nell'ordine di inserimento.
  4. Si desidera essere in grado di scorrere i valori nell'ordine di alcuni campi del tipo di valore.

Non esiste una singola classe di raccolta Java standard che soddisfi tutti questi requisiti. E non penso che le raccolte di Commons o le raccolte di Google potrebbero ...

Se si dovesse eliminare il requisito 3, allora un TreeSet (istanziato con un numero personalizzato Comparator) farebbe il lavoro. Se dovessi eliminare il requisito 4, allora un LinkedHashMap farebbe il lavoro.

Per soddisfare tutti i requisiti necessari per effettuare una delle seguenti operazioni:

  • Utilizzare un LinkedHashMap, e quando si desidera iterare in qualche modo dipendente dai valori estrarre collezione della mappa values, specie utilizzando il tuo comparatore personalizzato e restituiscono un iteratore per la raccolta ordinata.

  • Utilizzare sia un LinkedHashMap e un TreeMap e aggiornare i due in parallelo.

  • Creare una classe fascade personalizzata per un LinkedHashMap e un TreeMap. Ciò deve mantenere aggiornate entrambe le strutture dati quando si chiama put, remove eccetera e si forniscono anche metodi aggiuntivi per ottenere i valori ordinati.

5

Verificare http://java.sun.com/j2se/1.4.2/docs/api/java/util/LinkedHashMap.html per un'implementazione di mappa con ordine di iterazione prevedibile. Si potrebbe anche prendere in considerazione l'uso di un elenco solo se non si sta effettivamente effettuando la ricerca per chiavi.

+0

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

0

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.