Pregunta

Por último, intenté implementar una estructura híbrida en Java, algo que se parece a:

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

Donde HasKey es la siguiente interfaz:

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

Desafortunadamente, existen algunos conflictos entre la firma de métodos de la interfaz Set y la interfaz Map en Java.Finalmente elegí implementar solo la interfaz Set y agregar el método Map sin implementar esta interfaz.

¿Ves una mejor solución?

En respuesta a los primeros comentarios, este es mi objetivo:

Tener una estructura de conjunto y poder acceder de manera eficiente a un subconjunto de valores de este conjunto, correspondiente a un valor clave determinado.Al principio creé una instancia de un mapa y un conjunto, pero intenté unir las dos estructuras para optimizar el rendimiento.

¿Fue útil?

Solución

Quizás podría agregar más información sobre qué operaciones realmente desea.Supongo que quieres crear un conjunto que agrupe automáticamente sus elementos mediante una clave, ¿verdad?La pregunta es ¿qué operaciones quieres poder tener?¿Cómo se agregan los elementos al Conjunto?¿Se pueden eliminar elementos eliminándolos de una vista agrupada?Mi propuesta sería una interfaz así:

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

Si desea poder utilizar Establecer como mapa, puede agregar otro método

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

Eso evita el uso de herencia de interfaz múltiple y los problemas resultantes.

Otros consejos

¿Qué está tratando de lograr? Map ya expone sus claves como Set a través de su [keySet()](http://java.sun.com/j2se/1.5.0/docs/api/java/util/Map.html#keySet()) método.Si desea un orden de iteración confiable, existe LinkedHashMap y ÁrbolMapa.

ACTUALIZAR:Si desea asegurarse de que un valor solo se haya insertado una vez, puede extender una de las clases que mencioné anteriormente para crear algo como un SingleEntryMap y anular la implementación de put(K key, V value) para hacer una verificación de unicidad y lanzar una excepción cuando el valor ya se haya insertado.

ACTUALIZAR:¿Funcionará algo como esto?(No tengo mi editor activo, por lo que es posible que esto no se compile)

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

Yo diría que algo que debe usarse a veces como un Mapa y a veces como un Conjunto debería implementar Map, ya que puede verse como un conjunto de claves o valores, así como un mapeo entre claves y valores.Para eso están los métodos Map.containsKey() y Map.containsValue().

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top