Nuestro team de expertos pasados muchos días de investigación y recopilación de de información, dimos con la solución, esperamos que resulte de utilidad en tu proyecto.
Solución:
Si sabe qué elemento desea recuperar, entonces ya tiene el elemento. La única pregunta para un Set
responder, dado un elemento, es si contains()
eso o no.
Si desea iterar sobre los elementos, simplemente use un Set.iterator()
.
Parece que lo que intenta hacer es designar un elemento canónico para una clase de equivalencia de elementos. Puedes usar un Map
para hacer esto. Vea esta pregunta SO o esta para una discusión.
Si estás realmente decidido a encontrar un elemento que .equals()
su elemento original con la restricción de que DEBE usar el HashSet
creo que estás atascado iterando sobre él y comprobando equals()
tú mismo. La API no te permite agarrar algo por su código hash. Así que podrías hacer:
MyObject findIfPresent(MyObject source, HashSet set)
if (set.contains(source))
for (MyObject obj : set)
if (obj.equals(source))
return obj;
return null;
Fuerza bruta y O(n) feo, pero si eso es lo que necesitas hacer…
Puede HashMap
en lugar de HashSet
.
Vocación ContainsKey()
en tu “reconstruido” MyHashObject
será primero hashCode()
-verifique la colección, y si se encuentra un código hash duplicado, finalmente equals()
-verifique su “reconstruido” contra el original, en el que puede recuperar el original usando get()
Esto es O (1) pero la desventaja es que probablemente tendrá que anular ambos equals()
y hashCode()
métodos.
Parece que esencialmente estás tratando de usar el código hash como un key en un mapa (que es lo que hacen HashSets detrás de escena). Podrías hacerlo explícitamente, declarando HashMap
.
No hay get
para HashSets porque normalmente el objeto que proporcionaría al get
El método como parámetro es el mismo objeto que obtendría de vuelta.
Puedes añadir valor a nuestra información contribuyendo tu veteranía en los informes.