Pergunta

private HashMap<DataObject, HashSet> AllDataObjects;

...

/** Returns all DataObject elements that are NOT in the specified set. */
private DataObject[] invert( HashSet<DataObject> set )
{
    HashSet<DataObject> keys = (HashSet) AllDataObjects.keySet();
    keys = (HashSet) keys.clone();

    keys.removeAll( set );

    return (DataObject[]) keys.toArray();
}

Note que eu não quero AllDataObjects alter através deste processo. I escalado o conjunto de AllDataObjects' chaves (que são os DataObjects eu quero o parâmetro set para subtrair) em um HashSet para clone uso, que supostamente retorna uma cópia superficial que eu possa, em seguida, remover set de sem afetar AllDataObjects.

Será que este olhar direito para você?

Foi útil?

Solução

Criar um novo conjunto e dar o único a ser clonado como um argumento. Isso evita vazamento e assim você faz genéricos não perder.

private DataObject[] invert( Set<DataObject> set ){
    Set<DataObject> keys = new HashSet<DataObject>(AllDataObjects.keySet());
    keys.removeAll( set );
    return keys.toArray(new DataObject[]{});
}

Também é importante notar que você deve usar Set ao invés de HashSet para o parâmetro de modo a não excessivamente fardo seus clientes.

Outras dicas

Sabendo que esses conjuntos foram povoada por uma consulta relacional, eu sugiro que você, pelo menos trade off escrever uma consulta SQL melhor para conseguir o que deseja, em vez de fazê-lo na memória. Existem várias razões. Primeiro, a maioria dos bancos de dados relacionais são otimizados para fazer isso de forma mais eficiente do que o seu código vai. Em segundo lugar, você está deixando o servidor onde o banco de dados relacional está sendo executado fazer mais do trabalho que se destina. Em terceiro lugar, se o tamanho dos conjuntos de tornar-se grande, você será desnecessariamente sobrecarregar a camada intermediária por ter que trazer de volta os resultados, alocar memória para eles, e, em seguida, jogar fora os resultados indesejados.

Eu penso que este link tem uma maneira melhor para escrever esse método se deve:

Java : existe uma maneira fácil e rápida de AND, OR, XOR ou em conjunto conjuntos

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