Digamos que tengo este tipo en mi solicitud:Actualización de un objeto dentro de un conjunto
public class A {
public int id;
public B b;
public boolean equals(Object another) { return this.id == ((A)another).id; }
public int hashCode() { return 31 * id; //nice prime number }
}
y una estructura Set
. Ahora, tengo un objeto de tipo <A
>A
y quiero hacer lo siguiente:
- Si mi
A
es dentro del conjunto, actualice su campob
para que coincida con mi objeto. - De lo contrario, agréguelo al conjunto.
Por lo que comprobar si está allí es bastante fácil (contains
), y agregar al conjunto es fácil también. Mi pregunta es esta: ¿cómo obtengo un control para actualizar el objeto dentro? La interfaz Set
no tiene un método get
, y lo mejor que pude pensar fue eliminar el objeto en el conjunto y agregar el mío. otra, incluso peor, alternativa es atravesar el conjunto con un iterador para intentar localizar el objeto.
Con mucho gusto recibiré mejores sugerencias ... Esto incluye el uso eficiente de otras estructuras de datos.
Yuval = 8-)
EDITAR: Gracias a todos por responder ... Por desgracia no puedo 'aceptar' las mejores respuestas aquí, los que sugieren el uso de un Map
, porque al cambiar el tipo de la colección radicalmente para este propósito solo sería un poco extrema (esta colección ya está mapeada a través de Hibernate ...)
Una nota importante aquí: si define iguales, y está utilizando un conjunto, también DEBE DEBER DEBE definir hashCode, para que los elementos que se comparan sean iguales tengan el mismo código hash. –
Si puede responder la pregunta en mi respuesta sobre si necesita más campos que solo id yb, puedo editar mi respuesta para incluir solo el código que necesita. –
¿Por qué "31 * id"? ¿Hay alguna razón convincente para no usar "id" como hashCode? –