【问题标题】:Fastest way to determine the lowest available key in Java HashMap?确定Java HashMap中最低可用键的最快方法?
【发布时间】:2013-08-23 02:22:56
【问题描述】:

想象一下这样的情况: 我有一个HashMap<Integer, String>,用于存储连接的客户端。是HashMap,因为顺序无关紧要,我需要速度。它看起来像这样:

{
    3: "John",
    528: "Bob",
    712: "Sue"
}

大多数客户端断开连接,所以这就是我有很大差距的原因。 如果我想添加一个新客户端,我需要一个密钥,显然使用_map.size() 获取密钥是不正确的。

所以,目前我使用此功能来获取最低可用密钥:

private int lowestAvailableKey(HashMap<?, ?> _map) {
    if (_map.isEmpty() == false) {
        for (int i = 0; i <= _map.size(); i++) {
            if (_map.containsKey(i) == false) {
                return i;
            }
        }
    }

    return 0;
}

在某些情况下,这真的很慢。 有没有更快或更专业的方法来获得HashMap的最低免费密钥?

【问题讨论】:

  • 可能的解决方案是不使用HashMap,而是使用TreeMap。您可以按自然顺序遍历键。延伸阅读:stackoverflow.com/questions/922528/…
  • 如果订单无关紧要,为什么给新客户一个低数字很重要?为什么不给他们分配任何旧号码?
  • “因为顺序无关紧要”如果您想要一种最快的方法来确定最低键,它就可以了。
  • 您的搜索具有地图大小的上限。这到底是如何工作的?
  • 正如@BrianRoach 所说,如果它真的是你需要的(一个新的唯一键,而不是最低的键),简单的解决方案就是一些 FIFO 队列。一旦有人登录,您就有钥匙,您给他一个号码,当他们注销时,该号码会在最后返回队列以供重复使用。这就像在医生办公室:) 至少在我的国家。这种方法有 O(1) 的时间复杂度和 O(n) 的内存来保存密钥。

标签: java hashmap key


【解决方案1】:

有什么理由使用HashMap?如果您改用TreeMap,则地图将自动按键排序。是的,你最终得到 O(log n) 访问而不是 O(1),但这是最明显的方法。

当然,您始终可以同时维护 HashMap TreeSet,如果您确实需要,请确保同时添加和删除两个条目。 TreeSet 将充当地图的有序键集。

【讨论】:

    猜你喜欢
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 2016-12-24
    • 2012-02-10
    • 2018-02-13
    • 2013-03-29
    相关资源
    最近更新 更多