Obtenir les valeurs pour les clés à l'intérieur d'une gamme en Java
Supposons que j'ai une carte en Java, ce qui ressemble à ceci:
{
39:"39 to 41",
41:"41 to 43",
43:"43 to 45",
45:">=45"
}
Si les clés sont dans l'ordre de tri(soit à l'aide de treemap ou linkedhashmap).Maintenant, si j'essaie d'obtenir une valeur qui est >=39 <41.Ensuite je devrais obtenir la Chaîne de caractères "39 à 41".Comment puis-je le faire efficacement?
- Tu veux dire
<= 41
, je suppose. Mais vous cherchez toujours39,41,43,45
ou devrait-il travailler si vous essayez avec ex40,42,50
? Et s'il y a toujours un seul entre les deux? - Double Possible de structures de Données qui permet de cartographier une gamme de clés à une valeur
Vous devez vous connecter pour publier un commentaire.
Il semble que vous voulez plus qu'un
SortedMap
; vous voulez unNavigableMap
! Plus précisément, vous pouvez utiliser lefloorKey
opération.Voici un exemple:
Noter qu'il existe également
ceilingKey
,lowerKey
,higherKey
, et aussi…Entry
au lieu de…Key
opérations qui renvoie uneMap.Entry<K,V>
au lieu de simplement leK
.Essayer Java 6
java.util.NavigableMap
. http://download.oracle.com/javase/6/docs/api/java/util/NavigableMap.html.À usage spécial
floorKey
/floorEntry
.Par exemple:
floorKey(40)
doit retourner39
. floorEntry serait de retour la valeur que vous recherchez.Avec une triés carte, vous pouvez faire quelque chose comme ça:
Je ne suis pas sûr que cela va être facile. Une suggestion serait de "combler les lacunes", c'est à dire mettre une valeur
40->"39 to 41"
etc etc. Je suppose que cela ne sera possible que si vous savez l'ensemble de la gamme de nombres possibles dans la carte.Ou mabybe quelque chose qui remplace le
get
de vérifier pour voir si la valeur est dans la carte, et l'expansion jusqu'à ce qu'il trouve quelque chose. Je ne suis pas sûr que cela va être possible dans sa forme actuelle, comme vous pouvez l'avoir pour la fin de l'analyse des chaînes de valeur.Vous pouvez récursive look pour la limite inférieure.
Vous aurez besoin d'avoir un minimum de limite.
Vous auriez à mettre en œuvre une telle carte vous-même, je crois. Vous avez raison, il serait nécessaire de les trier; la mise en œuvre de
get
aurait pour itérer sur les touches jusqu'à ce qu'il trouve la plus grande clé qui est inférieur ou égal à l'argument.Si vous sous-classe
TreeMap
il serait à priori que vous pouvez obtenir ce travail par simplement en remplaçant laget()
méthode. Cependant, afin de maintenir autant de la Carte du contrat que possible, vous aurez à remplacer les autres méthodes de la cohérence.Et ce concernant, par exemple,
containsKey()
? Est-ce que votre principale contient une cartographie pour40
? Si vous retournezfalse
, alors le client peut décider de ne pas appelerget()
basé sur cette information; pour ces raisons (et la définition formelle), vous devrez retournertrue
. Mais alors il est difficile de déterminer si la carte "contient en réalité" une cartographie donnée; si vous cherchez à faire quelque chose comme la mise à jour sans écraser tout ce qui existe déjà.La
remove()
méthode peut être difficile aussi. De ma lecture de l'interface,Agissant constamment ici serait très délicat. Si vous avez une cartographie à partir de 35-40 par exemple, et que vous appelez
remove(38)
, alors que je comprends que vous auriez à revenirnull
par la suite obtient pour la clé de 38, mais de rendre celle-ci mappage de touches 35-37 ou 39-40.Ainsi, alors que vous pouvez commencer sur ce en substituant TreeMap, peut-être le concept de
Map
n'est pas tout à fait ce que vous voulez ici. Sauf si vous avez besoin de ce comportement de la fente dans les méthodes qui prennentMap
, il pourrait être plus facile de créer vous-même en tant que classe distincte puisqu'il n'est pas assez une Carte, à la manière de la définir.