这类列表/地图有数据结构吗?


22

也许有一个我想要的名字,但是我没有意识到。我需要与LinkedHashMapJava中类似的东西,但是如果指定的键没有值,它会返回“上一个”值。

也就是说,我有一个由整数键存储的对象列表(在我的情况下以时间为单位):

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

因此,如果我要查询键0-9的值,它将返回null。特殊的部分是,如果我查询10 <= i <= 14,它将返回A。或者,对于i> = 20,它将返回C。

是否有数据结构?


我不知道是否有一个已实现的实现,但是您可以扩展现有的实现。不知道是否能满足您的性能目标,我不知道...
瑞吉

1
+1是个好问题。大多数有三位低位代表的人都会问“请做我的作业”类型的问题。这里不是这样。
图兰斯·科尔多瓦

Answers:


33

您正在寻找NavigableMap。这是SortedMap的子类型,除了要排序的地图的性质外,还具有一些可用功能。请注意,“可导航地图”旨在取代SortedMap接口。(Java SE 6 Collections Framework增强功能)。当前实现的所有东西都SortedMap实现了,NavigableMap而且这很可能仍然适用。

特别是,floorKey(K key)“返回小于或等于给定密钥的最大密钥的方法,如果没有这样的密钥,则返回null。

这只是允许您获取地图的特定键或子地图的众多方法之一。

  • 最高/最低(高于/低于参数的条目)
  • 按键或地图的降序访问
  • 头/尾(条目小于/大于给定键)
  • 更高/更低(下一个高于或低于参数的键)
  • 子图(给定两个键,返回两个键之间的图)

Java具有NavigableMap的两个实现-TreeMapConcurrentSkipListMap

如果您查看跳过列表的想法/实现,您将了解为什么在这样的结构及其查询中它确实可以很好地工作。


1+个好答案。没想到Java API中存在这样一个特定的Map。
图兰斯·科尔多瓦

@ user61852我最喜欢的数据类型是跳过列表,并在其中查找。当我看到它在1.6中实现时,我查看了它提供的所有内容,并注意到它具有的接口,因此很熟悉它。

这就是说服我的事情,Java是您可以找到的最佳设计的语言之一。
图兰斯·科尔多瓦

1
请注意,虽然这似乎是在解决OP的问题,但它的行为并不像LinkedHashMap他提到的那样。TreeMapConcurrentSkipListMap按插入时间都不排序LinkedHashMap,而是按Comparator或键的自然排序(如果实现)排序Comparable
MikeFHay 2013年

1
很好的一点。地板操作是我一直在寻找的,可以轻松添加比较器。就我而言,实现比较器比重新发明轮子要好得多。谢谢。
尼克,

1

您正在寻找的是支持有序操作的符号表。在您的情况下,这是发言权操作。

符号表的哈希实现是最快的,但是它不提供那些有序的操作。

但是符号表的树实现确实可以。Java中的一个例子是TreeMap类

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.