Domanda

Infine, ho provato a implementare una struttura ibrida in Java, qualcosa che assomigli a:

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

Dove HasKey è la seguente interfaccia:

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

Sfortunatamente, ci sono alcuni conflitti tra la firma dei metodi dell'interfaccia Set e l'interfaccia Map in Java.Alla fine ho scelto di implementare solo l'interfaccia Set e di aggiungere il metodo Map senza implementare questa interfaccia.

Vedete una soluzione migliore?

In risposta ai primi commenti, ecco il mio obiettivo:

Avere una struttura fissa ed essere in grado di accedere in modo efficiente a un sottoinsieme di valori di questo insieme, corrispondente a un dato valore chiave.All'inizio ho istanziato una mappa e un set, ma ho cercato di unire le due strutture per ottimizzare le prestazioni.

È stato utile?

Soluzione

Forse potresti aggiungere ulteriori informazioni su quali operazioni desideri veramente.Immagino che tu voglia creare un set che raggruppi automaticamente i loro elementi in base a una chiave, giusto?La domanda è: quali operazioni vuoi poter avere?Come vengono aggiunti gli elementi al Set?È possibile eliminare gli elementi rimuovendoli da una vista raggruppata?La mia proposta sarebbe un'interfaccia del genere:

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

Se vuoi poter utilizzare Imposta come mappa puoi aggiungere un altro metodo

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

Ciò evita l'uso dell'ereditarietà di più interfacce e i problemi che ne derivano.

Altri suggerimenti

Cosa stai cercando di realizzare? Map espone già le sue chiavi come a Set tramite il suo [keySet()](http://java.sun.com/j2se/1.5.0/docs/api/java/util/Map.html#keySet()) metodo.Se vuoi un ordine iterativo affidabile, c'è LinkedHashMap E Mappa ad albero.

AGGIORNAMENTO:Se vuoi assicurarti che un valore sia stato inserito una sola volta, puoi estendere una delle classi che ho menzionato sopra per creare qualcosa come un SingleEntryMap e sovrascrivere l'implementazione di put(K key, V value) per eseguire un controllo di unicità e lanciare un'eccezione quando il valore è già stato inserito.

AGGIORNAMENTO:Funzionerà qualcosa del genere?(Non ho il mio editor attivo, quindi questo potrebbe non essere compilato)

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

Direi che qualcosa che è pensato per essere usato a volte come una mappa e talvolta come un set dovrebbe implementare Map, poiché può essere visto come un insieme di chiavi o valori nonché una mappatura tra chiavi e valori.Questo è lo scopo dei metodi Map.containsKey() e Map.containsValue().

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top