funciona ejemplo como colecciones java

ejemplo - treeset java



¿Por qué no hay un método reemplazar() definido en la interfaz Set? (5)

¿Por qué no se define ningún método replace () en la interfaz Set?

Puedo pensar en tres razones:

  1. Es funcionalmente redundante: set.replace(old, nu) es simplemente if (set.remove(old)) { set.add(nu) } por ejemplo.

  2. El comportamiento en el caso de que el old no esté presente agrega complicaciones.

  3. La adición de replace a Set API obliga a todas las implementaciones de Set a implementar un método (redundante).

Incluso puede ser que haya razones más profundas; por ejemplo, hacer con la implementación de replace en algún caso oscuro.

Sin embargo, como otros han señalado, su caso de uso no requiere replace alguno. Su código tiene el mismo efecto (*) que este:

Set myset = ... myset.add(element);

(* En realidad, es posible que pueda detectar una diferencia si su element.equals(Object) compara los objetos del elemento campo por campo. Dependiendo de la implementación del Conjunto, puede obtener diferentes referencias de objeto en los conjuntos después de ejecutar las dos secuencias de código. Pero, en la OMI, estarías pidiendo problemas si hicieras suposiciones sobre ese tipo de cosas.

Actualmente tengo que escribir lo siguiente para actualizar un elemento ya contenido en un Conjunto:

Set mySet= ... Element e1 = new Element (...); .... .... Element e2 = new Element (...); //e1 and e2 are different instances, but equals. //update the element contained into the Set if (mySet.contains(e2)){ mySet.remove(e2); myset.add(e2); }

Eso no se ve bien. ¿Hay alguna alternativa?


Creo que la alternativa es simplemente add .

De los docs :

Agrega el elemento especificado a este conjunto si aún no está presente (operación opcional). Más formalmente, agrega el elemento e especificado a este conjunto si el conjunto no contiene ningún elemento e2 tal que (e == null? E2 == null: e.equals (e2)). Si este conjunto ya contiene el elemento, la llamada deja el conjunto sin cambios y devuelve falso.

Sin embargo, no puedo decir de su pregunta si está intentando actualizar o reemplazar un elemento. Cuando cambias la propiedad de un elemento, esos cambios se reflejan automáticamente en el Set porque el Conjunto contiene referencias, por lo que no es realmente necesaria ninguna actualización . Si intenta reemplazar un elemento diferente , dicho método de replace sería redundante, como lo explicó

(después de editar la pregunta)

e1 y e2 son instancias diferentes, pero iguales.

Te sugiero que implementes la igualdad en Element . De esa manera, el método de add comprueba la existencia de un elemento, no por referencia (el Object.equals predeterminado) sino por su noción de igualdad en Element . Entonces, incluso si las referencias de e1 y e2 son diferentes, e1.equals(e2) == true .


Un conjunto es una estructura de datos creada para evitar la duplicación mediante el uso de equals () en el objeto; eso también significa que dos objetos que son iguales () entre sí se consideran perfectamente equivalentes. Es decir, si usa la versión que ya está en el Conjunto o la nueva, su código debería funcionar igual.

Si desea actualizar el objeto con un nuevo valor, entonces claramente este no es el caso para usted (las dos versiones no pueden reemplazarse), y luego debe usar otra estructura de datos (por ejemplo, un Mapa, donde puede anular el valor, en este caso, la clave puede ser incluso el propio objeto).


por definición, un conjunto no puede contener un elemento más de una vez, por lo que su contenido-> eliminar-> agregar algo no tiene sentido. simplemente agrega tu artículo tantas veces como quieras al conjunto.


No hay necesidad de quitar y luego agregar. Solo modifica el objeto directamente. Dado que los Conjuntos (o cualquier colección) simplemente almacenan la referencia, no necesita un método replace ().

EDIT: la declaración anterior es INCORRECTA. Consulte http://java.sun.com/j2se/1.4.2/docs/api/java/util/Map.html

Nota: se debe tener mucho cuidado si los objetos mutables se utilizan como claves de mapa. El comportamiento de un mapa no se especifica si el valor de un objeto se cambia de una manera que afecta a las comparaciones iguales mientras que el objeto es una clave en el mapa