Java 使用多键(1,2,3)在映射中存储条目。现在只有(1)。我可以检索多键中包含(1)的所有条目吗?
我已经使用带有3个参数的多键将值插入到地图中。现在,我想检索在其多键中具有特定键的所有条目-我不知道其他2.的值Java 使用多键(1,2,3)在映射中存储条目。现在只有(1)。我可以检索多键中包含(1)的所有条目吗?,java,multikey,Java,Multikey,我已经使用带有3个参数的多键将值插入到地图中。现在,我想检索在其多键中具有特定键的所有条目-我不知道其他2.的值 map.put(new MultiKey(valueA,valueB,valueC), value); 现在只有valueA,我需要检索值 如果需要澄清,请询问,我将详细说明,而不是投票结束。。谢谢: ..我实际上已经为此创建了一个类 public class MultiMap<K, V> { private final HashMap<KeySet&l
map.put(new MultiKey(valueA,valueB,valueC), value);
现在只有valueA,我需要检索值
如果需要澄清,请询问,我将详细说明,而不是投票结束。。谢谢:
..我实际上已经为此创建了一个类
public class MultiMap<K, V> {
private final HashMap<KeySet<K>, V> model = new HashMap<>();
public MultiMap() {}
public V add(V value, K first, K... keys) {
return model.put(new KeySet<>(first, keys));
}
public V add(V value, Set<K> keys){
return model.get(new KeySet<>(keys));
}
public Set<V> getIncludingSubsets(K... keys){
HashSet<V> all = new HashSet<>();
for (Entry<KeySet<K>, V> entry : model.entrySet()) {
if (entry.getKey().containsPartially(keys)) {
all.add(entry.getValue());
}
}
return all;
}
public Set<V> getIncludingSubsets(Set<K> keys){
HashSet<V> all = new HashSet<>();
for (Entry<KeySet<K>, V> entry : model.entrySet()) {
if (entry.getKey().containsPartially(keys)) {
all.add(entry.getValue());
}
}
return all;
}
public void clear(){
model.clear();
}
private class KeySet<T> extends HashSet<T>{
private KeySet(T first, T ... rest){
super();
add(first);
for (T object : rest) {
add(object);
}
}
private KeySet(Collection<T> data){
super(data);
}
@Override
public int hashCode() {
int hash = 5;
for (T value : this) {
hash = 41 * hash + Objects.hashCode(value);
}
return hash;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final KeySet<?> other = (KeySet<?>) obj;
return hashCode() == other.hashCode();
}
public boolean containsPartially(T... values){
for (T value : values) {
if (!contains(value)) {
return false;
}
}
return true;
}
public boolean containsPartially(Set<T> values){
for (T value : values) {
if (!contains(value)) {
return false;
}
}
return true;
}
}
}
我相信只要稍加创新,您就可以更改此实现,使其扩展哈希映射,而不是将哈希映射作为字段
static <V> List<V> getValues(Map<MultiKey, V> map, Object key1) {
List<V> values = new ArrayList<>();
for (Map.Entry<MultiKey, V> entry : map.entrySet()) {
MultiKey key = entry.getKey();
if (key.getKey(0).equals(key1)) {
values.add(entry.getValue());
}
}
return values;
}
可以很好地工作。将其扩展为使用多个键1、键2。。。作为练习留给读者。请您发布代码到目前为止您做了什么?我想您误解了多键的工作原理。将它用作键并不意味着您给定的任何键都指向一个值,而是意味着所有键的组合指向一个值。也许你需要的是一棵树,或者多张地图。@Mureinik不,我理解这个原理。只希望有一种方法可以对其进行编码:@JBNizet无法更改容器的类型,它必须是一个HashMap。。。你说的迭代是什么意思?把地图上所有的条目都看一遍好吗?嗯,谢谢!
[v1, v3]
[v1, v2]
[v1, v3]
[v1]
[v1, v2]
[v1]
static <V> List<V> getValues(Map<MultiKey, V> map, Object key1) {
List<V> values = new ArrayList<>();
for (Map.Entry<MultiKey, V> entry : map.entrySet()) {
MultiKey key = entry.getKey();
if (key.getKey(0).equals(key1)) {
values.add(entry.getValue());
}
}
return values;
}