2009-03-19 14 views
238

In Java, esiste un oggetto che si comporta come una mappa per l'archiviazione e l'accesso a coppie chiave/valore, ma può restituire un elenco ordinato di chiavi e un elenco ordinato di valori, in modo tale che la chiave e gli elenchi di valori siano nello stesso ordine?Java Ordered Map

Così come spiegazione-by-codice, sto cercando qualcosa che si comporta come il mio OrderedMap fittizia:

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); 
} 
+4

Se tutto quello che vuoi fare è iterare entrambi contemporaneamente, Map.entrySet() ti permetterà di farlo su qualsiasi mappa. La LinkedHashMap ha un ordine ben definito, ma per qualsiasi mappa il set di voci riflette le coppie chiave/valore. –

+4

Questo codice non è un buon esempio in quanto qualsiasi implementazione della mappa si comporterà come codice di esempio. ordinato, ordinato o meno. –

+0

Peter Lawrey: Potresti approfondire? L'interfaccia Mappa restituisce chiavi e valori rispettivamente come Set e Collection. L'ordine non è garantito in nessuno di questi, quindi non sembra ragionevole affermare che ogni implementazione di Map si comporterà come nel mio codice di esempio. – Whatsit

risposta

306

Il SortedMap di interfaccia (con l'implementazione TreeMap) dovrebbe essere tuo amico.

L'interfaccia ha metodi:

  • keySet() che restituisce un set di chiavi in ​​ordine crescente
  • values() che restituisce un insieme di tutti i valori in ordine crescente dei tasti corrispondenti

Quindi questa interfaccia soddisfa esattamente le vostre esigenze. Tuttavia, le chiavi devono avere un ordine significativo. In caso contrario, è possibile utilizzare lo LinkedHashMap in cui l'ordine è determinato dall'ordine di inserimento.

+1

esempio: SortedMap map = new TreeMap <>(); – Ben

+5

Per utilizzare TreeMap è necessario che la classe chiave abbia implementato l'interfaccia Comparable. In caso contrario, verrà generata una sorta di RuntimeException. TreeMap è anche la mappa ordinata, ma penso che l'autore voglia usare solo una mappa ordinata (non ordinata). LinkedHashMap è una buona scelta per ottenere solo la mappa ordinata (come hai detto, "determinata dall'ordine di inserimento"). –

162

C'è un oggetto che si comporta come una mappa per la memorizzazione e l'accesso a chiave/valore coppie, ma può restituire un elenco ordinato di chiavi e un elenco ordinato di valori, in modo tale che gli elenchi di chiavi e valori siano nello stesso ordine?

Stai cercando java.util.LinkedHashMap. Otterrai un elenco di coppie Map.Entry<K,V>, che vengono sempre ripetute nello stesso ordine. L'ordine è lo stesso dell'ordine in cui vengono inseriti gli articoli. In alternativa, utilizzare lo java.util.SortedMap, in cui le chiavi devono avere un ordine naturaleo essere specificato da un numero Comparator.

+10

E basta salvare il lettore ricontrollandolo, perché è difficile verificare testando, il 'keySet() 'metodo restituisce in modo efficace un LinkedHashSet che riflette l'ordine delle tue chiamate' put() '. Nota che le ripetute chiamate a 'put()' per lo stesso tasto non cambieranno l'ordine a meno che tu non abbia prima rimosso() 'il tasto. –

6

penso che la raccolta più vicino si arriva dal quadro è il SortedMap

+3

Preferirei votare questa risposta se pensassi che valesse la pena di perdere i punti. Come la risposta sopra evidenzia, la tua risposta non ha le informazioni corrette su LinkedHashMap e una piccola spiegazione di SortedMap sarebbe anche bella. – CorayThan

+0

@CorayThan, in tal caso si inviano le migliori risposte, non quelle di altri che potrebbero essere corrette ma non le migliori ... –

+1

Questo è quello che ho fatto. Sto solo dicendo che posso capire perché qualcuno potrebbe votare. – CorayThan

3

È possibile utilizzare l'interfaccia NavigableMap a cui è possibile accedere e attraversare in ordine crescente o decrescente. Questa interfaccia è intended to supersede l'interfaccia SortedMap. La mappa navigabile di solito è ordinata in base all'ordinamento naturale delle sue chiavi, o da un comparatore fornito al momento della creazione della mappa.

Esistono tre implementazioni più utili: TreeMap, ImmutableSortedMap e ConcurrentSkipListMap.

TreeMap esempio:

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) + ")"); 
} 

uscita:

Alice (ID = 2) 
Bob (ID = 1) 
John (ID = 3) 
13

LinkedHashMap mantiene l'ordine delle chiavi.

java.util.LinkedHashMap sembra funzionare come una normale HashMap altrimenti.

+0

Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti da un autore, lascia un commento sotto il loro post - puoi sempre commentare i tuoi post, e una volta che hai [reputazione] sufficiente (http://stackoverflow.com/help/whats-reputation) essere in grado di [commentare qualsiasi post] (http://stackoverflow.com/help/privileges/comment). – ianaya89

+1

@ ianaya89 Penso che questa sia una risposta reale, ma è molto simile alla risposta di [John Feminella's] (http://stackoverflow.com/a/663388/1677209)! – T30

+0

Se vuoi ottenere una mappa ordinata, dove le voci sono memorizzate in quell'ordine mentre le inserisci nella mappa, allora una LinkedHashMap è la risposta giusta. Se vuoi ordinare le voci nella tua mappa indipendentemente dall'ordine in cui le hai inserite, una SortedMap è la risposta giusta. – Ralph