我目前正在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;值)?
提前致谢!
答案 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