0

3 つのパラメーターを持つ Multikey を使用して、Map に値を挿入しました。ここで、マルチキーに特定のキーを持つすべてのエントリを取得したいと思います-他の2つの値についてはわかりません..

map.put(new MultiKey(valueA,valueB,valueC), value);

今は valueA しかありません。値を取得する必要があります

明確化が必要な場合は、質問してください。投票を終了するのではなく、詳しく説明します..ありがとう:)

..

4

2 に答える 2

1

私は実際にこのためだけにクラスを作成しました。

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

これがどのように機能するかを示すサンプルコードを次に示します。

MultiMap<String, String> mm = new MultiMap<>();

// "A","B","C" -> v1
// "A","B" -> v2
// "A","C" -> v3

mm.add("v1", "A", "B", "C");
mm.add("v2", "A", "B");
mm.add("v3", "A", "C");

System.out.println(mm.getIncludingSubsets("A", "C"));
System.out.println(mm.getIncludingSubsets("B"));
System.out.println(mm.getIncludingSubsets("C"));
System.out.println(mm.getIncludingSubsets("C", "B", "A"));
System.out.println(mm.getIncludingSubsets("B", "A"));
System.out.println(mm.getIncludingSubsets("B", "C"));

これにより、次が生成されます。

[v1, v3]
[v1, v2]
[v1, v3]
[v1]
[v1, v2]
[v1]

少しの創造性でこの実装を変更しHashMapて、フィールドとして持つのではなく拡張できると確信しています。

于 2015-03-11T09:18:01.367 に答える