HashMap:查找下一个低位键

时间:2014-07-14 12:13:30

标签: java hashmap

我目前正在HashMap中为不同的客户端版本存储编组库。 使用org.reflections API加载库。为简单起见,我只需手动插入一些值。它们的意图是无序的,因为我对启动时反射API初始化地图的顺序没有影响。 密钥(ClientVersion)是枚举。

HashMap<ClientVersion, IMarshalLib> MAP = new HashMap<>();
MAP.put(ClientVersion.V100, new MarshalLib100());
MAP.put(ClientVersion.V110, new MarshalLib110());
MAP.put(ClientVersion.V102, new MarshalLib102());
MAP.put(ClientVersion.V101, new MarshalLib101());
MAP.put(ClientVersion.V150, new MarshalLib150());

到目前为止,问题一直很好,现在的问题是,有一些客户端版本,其中编组自上一版本以来没有改变。

我们说,我们有一个客户端版本ClientVersion.V140。在这种特殊情况下,我正在寻找MarshalLib110,分配给ClientVersion.V110。

我如何获得所需的结果(没有遍历所有条目并且每次都抓住&#34;下一个较低的&#34;值)?

提前致谢!

2 个答案:

答案 0 :(得分:3)

  

我如何获得所需的结果(不会遍历所有条目并且每次都抓住“下一个较低的”值)

关于“遍历所有条目”部分你无能为力:因为地图是无序的,所以没有迭代整套键就无法找到下一个较小的项目。

但是,您可以对“每次”部分做些事情:如果您将此地图的副本复制到TreeMap,则可以通过调用{来查找下一个较小的项目{3}}方法。

另一种方法是将密钥复制到侧面的数组中,对数组进行排序,并在每次需要查找下一个较小的密钥时运行二进制搜索。使用密钥,您可以在哈希映射中查找条目。

答案 1 :(得分:0)

我建议你使用NavigableSet。看看这个例子:

    HashMap<Integer, String> map = new HashMap<>();
    map.put(100, "MarshalLib100");
    map.put(110, "MarshalLib110");
    map.put(102, "MarshalLib102");
    map.put(101, "MarshalLib101");
    map.put(150, "MarshalLib150");

    NavigableSet<Integer> set = new TreeSet<>(map.keySet());

    Integer key = set.lower(150);   // ^ -> 110
    String  val = map.get(key);     // ^ -> MarshalLib110

    // or
    key = set.higher(110);// ^ -> 150
    val = map.get(key);   // ^ -> MarshalLib150

更新:使用TreeMap 查找下一个较低的密钥 并不正确。例如:

    TreeMap<Integer, String> treeMap = new TreeMap<Integer, String>();
    treeMap.put(100, "MarshalLib100");
    treeMap.put(110, "MarshalLib110");
    treeMap.put(102, "MarshalLib102");
    treeMap.put(101, "MarshalLib101");
    treeMap.put(150, "MarshalLib150");

    System.out.println(treeMap.floorKey(102));
    System.out.println(treeMap.floorEntry(102)); 
    System.out.println(treeMap.ceilingKey(102));
    System.out.println(treeMap.ceilingEntry(102));

<强>输出:

102
102=MarshalLib102
102
102=MarshalLib102