java - Java TreeMap 有两个键并且可以使用单个键?
问题描述
我想要一个带有两个键的 Treemap,它可以通过单个键调用。
示例:key1 是字符串,key2 是整数,值是对象。
数据示例:
{('alice', 124221, obj1), ('bob', 241241, obj2), .... }
getByString('alice') ==> obj1
getByInt(124221) ==> obj1
注意:永远不需要同时使用两个键来获取对象。一个就够了
问题:
可以在一张地图中实现吗?如果是,是否可以保证通过任一键获取值具有 O(log n) 时间复杂度?
解决方案
正如@azurefrog 指出的那样,您想要的行为不是由 TreeMap 直接提供的,因此您需要某种包装类。这是一个例子;我已经将 TreeMaps 用于内部实现,但除非您想以某种方式使用更多方法的排序,否则最好使用 HashMap 代替,因为那时您将获得 O(1) 获取和放置操作,而不是 O(log n) .
import java.util.Map;
import java.util.TreeMap;
public class TwoKeysMap<K1 extends Comparable<K1>, K2 extends Comparable<K2>, V> {
private static class Entry<K1 extends Comparable<K1>, K2 extends Comparable<K2>, V> {
private final K1 k1;
private final K2 k2;
private final V v;
private Entry(K1 k1, K2 k2, V v) {
this.k1 = k1;
this.k2 = k2;
this.v = v;
}
}
private final Map<K1, Entry<K1, K2, V>> map1 = new TreeMap<>();
private final Map<K2, Entry<K1, K2, V>> map2 = new TreeMap<>();
public V getByKey1(K1 k1) {
Entry<K1, K2, V> e = map1.get(k1);
return e != null ? e.v : null;
}
public V getByKey2(K2 k2) {
Entry<K1, K2, V> e = map2.get(k2);
return e != null ? e.v : null;
}
public void put(K1 k1, K2 k2, V v) {
Entry<K1, K2, V> e = new Entry<>(k1, k2, v);
map1.put(k1, e);
map2.put(k2, e);
}
}
用法:
> TwoKeysMap<String, Integer, Object> map = new TwoKeysMap<>();
> map.put("alice", 124221, "Object 1");
> map.put("bob", 241241, "Object 2");
> map.getByKey1("alice")
"Object 1" (Object)
> map.getByKey2(124221)
"Object 1" (Object)
请注意,Entry
“get”和“put”并不严格需要内部类,但如果您想通过 key1 删除,则条目也需要存储 key2,以便您可以从两个映射中删除,反之亦然:
public void removeByKey1(K1 k1) {
Entry<K1, K2, V> e = map1.remove(k1);
if(e != null) {
map2.remove(e.k2);
}
}
public void removeByKey2(K2 k2) {
Entry<K1, K2, V> e = map2.remove(k2);
if(e != null) {
map1.remove(e.k1);
}
}
推荐阅读
- tsql - 使用子查询提高 CTE 的性能
- java - 使用 Java.util.Timer 执行 SQL 查询时 JavaFX 抛出异常
- asp.net - EF Core - 在 asp.net 项目中使用 EF Core Migrate 时获取 System.ExecutionEngineException 异常
- atom-editor - 在服务器端使用 anaconda 进行 Nuclide 远程开发设置
- javascript - Alexa Skill 在 Ajax 请求后没有响应
- ruby-on-rails - 安装 nio4r (2.3.1) 时出错 - 全新 rails install
- html - 让 S3 静态站点在 .com/my_url.html 而不是 .com/index.html 上解析
- matlab - Octave中的交易功能不起作用
- java - Java Calendar.DAY_OF_WEEK 给出错误的日期
- c - Bitwise arthmetric 这个结果是真还是假