Java 使用多键(1,2,3)在映射中存储条目。现在只有(1)。我可以检索多键中包含(1)的所有条目吗?

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

我已经使用带有3个参数的多键将值插入到地图中。现在,我想检索在其多键中具有特定键的所有条目-我不知道其他2.的值

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;
}