Talvez haja um nome para o que eu quero, mas não estou ciente disso. Eu preciso de algo semelhante a um LinkedHashMap
em Java, mas onde ele retorna o valor 'anterior' se não houver valor na chave especificada.
Ou seja, eu tenho uma lista de objetos armazenados por uma chave inteira (que está em unidades de tempo no meu caso):
; key->value
10->A
15->B
20->C
Portanto, se eu pedisse um valor para a chave 0-9, ela retornaria null
. A parte especial é que, se eu consultasse algo 10 <= i <= 14, retornaria A. Ou, para i> = 20, retornaria C.
Existe uma estrutura de dados para isso?
java
data-structures
usuario
fonte
fonte
Respostas:
Você está procurando um NavigableMap . Este é um subtipo de SortedMap que também possui algumas funções disponíveis além da natureza do mapa que está sendo classificado. Observe que o mapa navegável "se destina a substituir a interface do SortedMap". ( Aprimoramentos da estrutura do Java SE 6 Collections ). Tudo o que atualmente implementa
SortedMap
implementaNavigableMap
e isso provavelmente permanecerá verdadeiro.Em particular, o método
floorKey(K key)
que "retorna a maior chave menor ou igual à chave especificada ou nulo se não houver essa chave.Este é apenas um dos muitos métodos que permitem obter chaves ou submapas específicos do mapa.
Java possui duas implementações do NavigableMap - o TreeMap e o ConcurrentSkipListMap .
Se você olhar para a idéia / implementação de uma lista de pulos , verá por que ela funcionaria muito bem com essa estrutura e suas consultas.
fonte
LinkedHashMap
que ele menciona. NemTreeMap
nemConcurrentSkipListMap
são ordenados por tempo de inserção, comoLinkedHashMap
, ao contrário, eles são ordenados por umaComparator
ordem natural ou da chave se eles implementamComparable
.O que você está procurando é uma tabela de símbolos que suporte operações ordenadas. E no seu caso, é a operação no chão.
A implementação de hash de uma tabela de símbolos é a mais rápida, mas não oferece essas operações ordenadas.
Mas a implementação em árvore das tabelas de símbolos sim. Um exemplo disso em Java é a classe TreeMap
fonte