Frage

Lasty habe ich versucht, eine Hybridstruktur in Java, etwas zu implementiert, die wie folgt aussieht:

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

Wo Haskey ist die folgende Schnittstelle:

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

Leider gibt es einige Konflikte zwischen methos Unterzeichnung der Set-Schnittstelle und der Map-Schnittstelle in Java. Ich habe schließlich entschieden nur die Set-Schnittstelle implementiert und ohne Umsetzung dieser Schnittstelle, um die Map-Methode hinzuzufügen.

Sehen Sie eine schönere Lösung?

Als Reaktion auf die ersten Kommentare, hier ist mein Ziel:

  

eine feste Struktur haben und in der Lage sein, effizient auf eine Teilmenge von Werten dieses Satzes den Zugang zu einem gegebenen Schlüsselwert entspricht.   Zu Beginn instanziiert ich eine Karte und einen Satz, aber ich versuchte, kamen die beiden Strukturen Leistungen zu optimieren.

War es hilfreich?

Lösung

Vielleicht könnten Sie weitere Informationen hinzufügen, die Operationen, die Sie wirklich tun wollen. Ich denke, Sie wollen einen Satz erstellen, die automatisch Gruppen ihre Elemente durch einen Schlüssel, nicht wahr? Die Frage ist, welche Vorgänge haben Sie in der Lage sein wollen? Wie werden die Elemente mit dem Set hinzugefügt? Können Elemente, indem sie aus einer gruppierten Ansicht gelöscht werden? Mein Vorschlag wäre eine Schnittstelle wie folgt aus:

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

Wenn Sie in der Lage sein, die als Set Karte verwenden Sie eine andere Methode hinzufügen

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

Das vermeidet die Verwendung von mehrere Schnittstellenvererbung und die daraus resultierenden Probleme.

Andere Tipps

Was wollen Sie erreichen? Map bereits entlarvt seinen Schlüssel als Set über seinen [keySet ()] ( http://java.sun.com/j2se/1.5.0/docs/api/java/util/Map.html#keySet ()) Methode. Wenn Sie eine zuverlässige iteratior bestellen möchten, gibt es LinkedHashMap und TreeMap .

UPDATE: Wenn Sie, dass ein Wert sicherstellen wollen, nur einmal eingesetzt wurde, können Sie eine der Klassen erweitern die ich oben erwähnte so etwas wie ein SingleEntryMap zu schaffen und die Umsetzung von put(K key, V value) außer Kraft setzen eine Einzigartigkeit Prüfung zu tun und eine Ausnahme auslösen wenn der Wert bereits eingeführt worden ist.

UPDATE: Will etwas wie diese Arbeit? (Ich weiß nicht meinen Redakteur muß, so kann dies nicht kompilieren)

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

Ich würde sagen, dass etwas, das manchmal als eine Karte verwendet, gemeint ist, werden manchmal als ein Set sollte Karte implementieren, da dies als eine Reihe von Schlüsseln oder Werten sowie eine Zuordnung zwischen Schlüssel und Werte betrachtet werden können. Das ist, was die Map.containsKey () und Map.containsValue () Methoden sind für.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top