Pergunta

Lasty, eu tentei implementa uma estrutura híbrida em Java, algo que se parece com:

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

Onde HasKey é a seguinte interface:

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

Infelizmente, existem alguns conflitos entre o método de assinatura do Set interface e a interface de Mapa em Java.Eu finalmente escolhido para implementa somente o Conjunto de interface e adicionar o método Map sem implementar esta interface.

Você vê uma melhor solução?

Em resposta à primeira comentários, aqui é o meu objetivo:

Ter um conjunto de estrutura e ser capaz de eficientemente o acesso a um subconjunto de valores deste conjunto, correspondente a um determinado valor de chave.No início eu instanciado um mapa e um conjunto, mas eu tentei juntou-se as duas estruturas para otimizar o desempenho.

Foi útil?

Solução

Talvez você poderia adicionar mais informações, as operações que você realmente quer.Eu acho que você queira criar um conjunto que agrupa automaticamente os seus elementos por uma chave, certo?A questão é que as operações que você deseja ser capaz de ter?Como são elementos adicionados ao Conjunto?Podem ser elementos excluídos por removê-los a partir de uma exibição agrupada?A minha proposta seria uma interface como:

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

Se você quer ser capaz de usar o Conjunto como mapa, você pode adicionar outro método

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

Que evita a utilização de vários herança da interface e os problemas resultantes.

Outras dicas

O que você está tentando realizar? Map já expõe suas chaves como um Set através da sua [de conjunto de chaves()](http://java.sun.com/j2se/1.5.0/docs/api/java/util/Map.html#keySet()) o método.Se você quer um confiável iteratior fim, há LinkedHashMap e TreeMap.

ATUALIZAÇÃO:Se você quer garantir que o valor só foi inserido uma vez, você pode estender uma das classes que eu mencionei acima, para criar algo como um SingleEntryMap e substituir a implementação de put(K key, V value) para fazer uma verificação de exclusividade e lançar uma Exceção quando o valor já foi inserido.

ATUALIZAÇÃO:Será algo como isto funciona?(Eu não tenho o meu editor, para que isso não pode compilar)

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

Eu diria que algo que é feito para ser usado às vezes como um Mapa e, por vezes, como um Conjunto deve implementar Mapa, uma vez que pode ser visto como um conjunto de chaves ou valores, bem como um mapeamento entre chaves e valores.Que é o que o Mapa.containsKey() e Mapa.containsValue() métodos para.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top