Existe uma estrutura de dados para esse tipo de lista / mapa?

22

Talvez haja um nome para o que eu quero, mas não estou ciente disso. Eu preciso de algo semelhante a um LinkedHashMapem 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?

usuario
fonte
Não sei se existe um implementado, mas você provavelmente poderia estender o existente para fazer isso. Se ele vai atender às suas metas de desempenho ou não sem uma reescrita Eu não sei ...
Rig
1
+1 para a ótima pergunta. A maioria das pessoas com três representantes de baixo dígito faz o tipo de pergunta "por favor, faça minha lição de casa". Não é o caso aqui.
Tulains Córdova

Respostas:

33

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 SortedMapimplementa NavigableMape 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.

  • teto / piso (a entrada que é mais alta / mais baixa que o parâmetro)
  • acesso de chaves ou mapa em ordem decrescente
  • cabeça / cauda (as entradas menores / maiores que uma determinada chave)
  • maior / menor (a próxima tecla que é maior ou menor que o parâmetro)
  • submapa (com duas chaves, retorne o mapa que está entre as duas chaves)

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
1+ ótima resposta. Nunca pensei que existisse um mapa tão específico na API Java.
Tulains Córdova 03/10
@ user61852 Meu tipo de dados favorito é a lista de pulos e eu dei uma espiada nela. Quando o vi implementado na versão 1.6, examinei tudo o que fornecia e observei as interfaces que ele possuía e, portanto, minha familiaridade com ele.
Esse é o tipo de coisa que me convence que Java é uma das linguagens mais bem projetadas que você pode encontrar.
Tulains Córdova 03/10
1
Observe que, embora isso pareça resolver o problema do OP, ele não age como o LinkedHashMapque ele menciona. Nem TreeMapnem ConcurrentSkipListMapsão ordenados por tempo de inserção, como LinkedHashMap, ao contrário, eles são ordenados por uma Comparatorordem natural ou da chave se eles implementam Comparable.
MikeFHay
1
Muito bom ponto. A operação de piso é o que eu estava procurando, o comparador que posso adicionar facilmente. E no meu caso, é muito melhor implementar o comparador em vez de reinventar a roda. Obrigado.
Nick
1

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

Moha, o todo-poderoso camelo
fonte