【发布时间】: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) 的内存来保存密钥。