首页 > 解决方案 > Hashtable - 获取索引之前的第一个元素

问题描述

我有这个哈希表:

private final Hashtable<Integer,Character> htable = new Hashtable<>();

我在表中存储了一些元素,其索引可能达到很高的范围。然后,当我想获得一个项目时,如果它不存在,我想先获得第一个现有的。

一种天真的方法可能是:

int index = given_index;
while(htable.get(index) == null && index >= 0)
    index --;

这样做可能会计算大量的值。有没有更好的策略,或者可能是另一种允许计算更少的表?

标签: javadatatable

解决方案


NavigableMap(如 user15358848 评论中所述)

参考:NavigableMap

通常,实现不应该支持null值。如果有支持 的实现null,则无法检查响应null是由于缺少还是由于实际值。

较低的入口

返回与严格小于给定键的最大键关联的键值映射,如果没有这样的键,则返回 null。

  1. get键值
  2. 如果获取的值是null,则获取lowerEntry
  3. getOrDefault(key, navigableMap.lowerEntry(index))如果实际密钥主要是由于额外的navigableMap.lowerEntry调用而出现的,那将是昂贵的
  Character value = navigableMap.get(index);
  if (value == null) {
    value = navigableMap.lowerEntry(index);
  }
  return value;

楼层入口

返回与小于或等于给定键的最大键关联的键值映射,如果没有这样的键,则返回 null。

  1. 阅读使用floorEntry
  2. 如果非空条目,则返回值
  3. 否则返回null
  Map.Entry<Integer,​ Character> entry = navigableMap.floorEntry(index);
  return null != entry ? entry.getValue() : null;

推荐阅读