Pregunta

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

Tenga en cuenta que no quiero alterar AllDataObjects a través de este proceso. I Casted el conjunto de AllDataObjects' teclas (que son los DataObjects Quiero que el parámetro set Para restar de) en un HashSet utilizar clon, que supuestamente devuelve una copia superficial que entonces puedo eliminar set de sin afectar AllDataObjects.

¿Esto se ve bien a usted?

¿Fue útil?

Solución

Crear un nuevo conjunto y dar la una a clonar como un argumento. Esto evita la fundición y para que no pierda los genéricos.

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

Es también digno de mención que se debe utilizar en lugar de Conjunto HashSet para el parámetro con el fin de no excesivamente carga a sus clientes.

Otros consejos

Sabiendo que estos conjuntos fueron pobladas por una consulta relacional, sugeriría que al menos el comercio fuera de escribir una mejor consulta SQL para obtener lo que desea en lugar de hacerlo en la memoria. Hay varias razones para ello. En primer lugar, la mayoría de las bases de datos relacionales están optimizados para hacerlo más eficiente que su voluntad código. En segundo lugar, estás dejando que el servidor en la base de datos relacional se está ejecutando hacer más del trabajo que se destina. En tercer lugar, si el tamaño de los conjuntos se convierten en grandes podrás recargar innecesariamente el nivel medio por tener que traer de vuelta a los resultados, asignar memoria para ellos, y luego tirar los resultados deseados.

Creo que este enlace tiene una mejor manera de escribir dicho método, si es necesario:

Java

: ¿hay una manera fácil y rápida de AND, OR, XOR o juntos conjuntos

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