3

最後に、次のようなハイブリッド構造を Java で実装しようとしました。

public class MapOfSet<K, V extends HasKey<K>> implements Set<V>, Map<K, Set<V>>

HasKey は次のインターフェイスです。

public interface HasKey<K> {
    public K getKey();
}

残念ながら、Java の Set インターフェイスと Map インターフェイスのメソッド シグネチャの間にはいくつかの競合があります。最終的に、Set インターフェイスのみを実装し、このインターフェイスを実装せずに Map メソッドを追加することにしました。

もっと良い解決策はありますか?

最初のコメントに応えて、ここに私の目標があります:

セット構造を持ち、特定のキー値に対応するこのセットの値のサブセットに効率的にアクセスできます。最初はマップとセットをインスタンス化しましたが、パフォーマンスを最適化するために 2 つの構造を結合しようとしました。

4

3 に答える 3

3

何を達成しようとしていますか?はすでに[keySet()]( http://java.sun.com/j2se/1.5.0/docs/api/java/util/Map.html#keySet())Mapメソッドを介してキーを公開しています。信頼できる反復順序が必要な場合は、LinkedHashMapTreeMapがあります。Set

更新:値が一度だけ挿入されたことを確認したい場合は、上記のクラスのいずれかを拡張して、のようなものを作成しSingleEntryMap、の実装をオーバーライドput(K key, V value)して、一意性チェックを実行し、値が既に挿入されている場合に例外をスローすることができます。挿入されました。

更新: このようなものは機能しますか? (エディタを起動していないため、コンパイルできない可能性があります)

public final class KeyedSets<K, V> implements Map<K,Set<V>> {
    private final Map<K, Set<V>> internalMap = new TreeMap<K, Set<V>>;
    // delegate methods go here
    public Set<V> getSortedSuperset() {
        final Set<V> superset = new TreeSet<V>();
        for (final Map.Entry<K, V> entry : internalMap.entrySet()) {
            superset.addAll(entry.getValue());
        }
        return superset;
    }
}
于 2008-09-16T09:39:55.243 に答える
1

おそらく、本当に必要な操作に関する情報を追加できます。要素をキーで自動的にグループ化するセットを作成したいと思いますよね? 問題は、どの操作を実行できるようにするかです。要素はどのようにセットに追加されますか? グループ化されたビューから要素を削除することで要素を削除できますか? 私の提案は、次のようなインターフェースになります。

public interface GroupedSet<K, V extends HasKey<K>> extends Set<V>{
    Set<V> havingKey(K k);
}

Set as マップを使用できるようにしたい場合は、別のメソッドを追加できます

Map<K,Set<V>> asMap();

これにより、複数のインターフェース継承の使用とその結果生じる問題が回避されます。

于 2008-09-16T10:16:11.677 に答える
0

Map として使用されることもあれば Set として使用されることも意図されているものは、Map を実装する必要があると言えます。これは、キーまたは値のセット、およびキーと値の間のマッピングと見なすことができるためです。それが Map.containsKey() および Map.containsValue() メソッドの目的です。

于 2008-09-16T09:37:59.400 に答える