Esiste una struttura di dati per questo tipo di elenco / mappa?


22

Forse c'è un nome per quello che voglio, ma non ne sono consapevole. Ho bisogno di qualcosa di simile a a LinkedHashMapin Java, ma in cui restituisce il valore "precedente" se non esiste alcun valore nella chiave specificata.

Cioè, ho un elenco di oggetti memorizzati da una chiave intera (che è in unità di tempo nel mio caso):

; key->value
10->A
15->B
20->C

Quindi, se dovessi richiedere un valore per la chiave 0-9, ritornerebbe null. La parte speciale è che se avessi cercato qualcosa di 10 <= i <= 14 avrebbe restituito A. Oppure, per i> = 20, avrebbe restituito C.

Esiste una struttura di dati per questo?


Non so se ce ne sia uno implementato ma probabilmente potresti estendere quello esistente per farlo. Se raggiungerà i tuoi obiettivi prestazionali o meno senza una riscrittura non lo so ...
Rig

1
+1 per la grande domanda. La maggior parte delle persone con tre rappresentanti a bassa cifra pongono la domanda "per favore, fai i miei compiti". Non è il caso qui.
Tulains Córdova,

Risposte:


33

Stai cercando una NavigableMap . Questo è un sottotipo di SortedMap che ha anche alcune funzioni disponibili oltre alla natura della mappa da ordinare. Si noti che la mappa navigabile "è destinata a sostituire l'interfaccia SortedMap." ( Miglioramenti al framework delle raccolte Java SE 6 ). Tutto ciò che attualmente implementa gli SortedMapstrumenti NavigableMape questo probabilmente rimarrà vero.

In particolare, il metodo floorKey(K key)che "restituisce la chiave maggiore minore o uguale alla chiave data, oppure null se non esiste tale chiave.

Questo è solo uno dei tanti metodi che ti consentono di ottenere chiavi specifiche o sottomappa della mappa.

  • soffitto / pavimento (la voce più alta / più bassa del parametro)
  • accesso di chiavi o mappa in ordine decrescente
  • head / tail (le voci meno / maggiore di una determinata chiave)
  • superiore / inferiore (il tasto successivo che è superiore o inferiore al parametro)
  • submap (date due chiavi, restituisce la mappa che si trova tra le due chiavi)

Java ha due implementazioni di NavigableMap: TreeMap e ConcurrentSkipListMap .

Se guardi l'idea / l'implementazione di un elenco skip , vedrai perché funzionerebbe davvero bene con una tale struttura e le sue query.


1+ ottima risposta. Non avrei mai pensato che esistesse una mappa così specifica nell'API Java.
Tulains Córdova,

@ user61852 Il mio tipo di dati preferito è la skip list e ho cercato con esso. Quando l'ho visto implementato in 1.6 ho esaminato tutto ciò che forniva e ho notato le interfacce che aveva e quindi la mia familiarità con esso.

Questo è il tipo di cose che mi convincono che Java è una delle lingue più progettate che puoi trovare.
Tulains Córdova,

1
Si noti che mentre questo sembra risolvere il problema di OP, non si comporta come quello LinkedHashMapche menziona. Né TreeMapConcurrentSkipListMapsono ordinate per tempo di inserimento, come LinkedHashMap, anzi sono ordinate per un Comparatordi o il tasto ordinamento naturale se attuano Comparable.
MikeFHay,

1
Ottimo punto L'operazione sul pavimento è ciò che stavo cercando, il comparatore che posso aggiungere facilmente. E nel mio caso funziona molto meglio implementare il comparatore invece di reinventare la ruota. Grazie.
Nick,

1

Quello che stai cercando è una tabella dei simboli che supporti le operazioni ordinate. E nel tuo caso è l'operazione al piano.

L'implementazione hash di una tabella dei simboli è la più veloce, ma non offre le operazioni ordinate.

Ma lo fa l'implementazione ad albero delle tabelle dei simboli. Un esempio di ciò in Java è la classe TreeMap

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.