Dan*_*lle 7 java key hashmap data-structures
我正在为我的问题寻找合适的数据结构.我希望能够使用两个键尽可能高效地选择节点对象.插入和删除也需要有效.基本上每个节点对象都有一对两个键.这些对是唯一的,但个别键不是.我需要能够为两个键中的一个选择一组具有特定值的节点.
例:
Node1具有键a1和b1
Node2具有密钥a1和b2
Node3具有密钥a2和b2
我想例如能够选择具有密钥a1,b1的节点以及具有b2作为key2的所有节点.
我当然可以制作两个HashMaps(每个键一个),但这是一种丑陋的解决方案,因为当我添加或删除某些东西时,我必须在两个映射中都这样做.由于会有很多添加和删除,我宁愿一次性完成.有没有人对如何做到这一点有任何想法?
显然,将两个密钥合并在一起的单个密钥并不能解决问题,因为我还需要能够搜索单个密钥而无需搜索整个映射.那不会很有效率.问题是效率问题.我可以在地图中搜索特定键的每个条目,但我想使用哈希,以便我可以立即使用两个键中的任何一个选择多个节点对象.
我不是在寻找类似MultiKeyMap的东西,因为在这个数据结构中第一个键总是保持不变,你只能添加键而不是用不同的键替换第一个键.我希望能够在第一个和第二个键之间切换.
我喜欢并且不想使用相同的密钥存储多个对象.如果您查看示例,您可以看到两个键一起始终是唯一的.这可以看作是单个键,因此我不会在同一个键下存储多个对象.但是如果你看一下各个键,它们并不是唯一的,因此我想存储各个键所引用的多个对象.
You have to create a key class (equality is treated as Point):
public class Key {
int field1;
int field2;
public boolean equals(Object o) {
if (o == null || !(o instanceof Key)) return false;
Key other = (Key) o;
return field1 == other.field1 && field2 == other.field2;
}
public int hashCode() {
return field1*field2; // doesn't matter if some keys have same hash code
}
}
Run Code Online (Sandbox Code Playgroud)
要在第一个字段中选择具有一个特定值的键:
public List<Key> getKeysWithField1EqualsTo(int value) {
List<Key> result = new ArrayList<>();
for (Key k: map.keySet()) {
if (k.field1 == value) result.add(k);
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10908 次 |
| 最近记录: |