studio reales proyectos programacion libro introducción incluye herramientas fundamentos fuente español código con avanzado aplicaciones java performance set big-o

java - reales - libro de android studio en español pdf



¿Debería verificar si hay un duplicado antes de insertarlo en un conjunto? (5)

Aquí están las respuestas a sus preguntas:

Cuando intentamos insertar duplicados, no produce ningún error y elimina automáticamente los duplicados.

Tu entendimiento no es correcto. La llamada a Set.add() no agregará un nuevo elemento si ya está en el conjunto; esta declaración se aplica a todas las implementaciones de Set , incluidos HashSet y TreeSet .

¿Es una buena práctica verificar cada valor antes de insertar en el conjunto si existe o no? ¿O está bien hacer algo como el siguiente código? Creo que Java estaría haciendo la comprobación internamente usando .contains (valor). ¿Qué piensas?

Debido a que su comprensión fue incorrecta desde el principio, no necesita verificar cada valor antes de insertarlo en el conjunto para ver si ya existe. Sí, internamente, está haciendo algo parecido a contains() .

¿Cuál sería la complejidad del Big Oh en ambos casos considerando que hay elementos "n" que entran en el conjunto?

Para HashSet, la complejidad del tiempo es O(1) para cada add() . Para TreeSet() , que no usó, la complejidad del tiempo es O(lg N) para cada add() .

Estoy aprendiendo a usar conjuntos. Mi pregunta es: Los conjuntos no contienen duplicados. Cuando intentamos insertar duplicados, no produce ningún error y elimina automáticamente los duplicados. ¿Es una buena práctica verificar cada valor antes de insertar en el conjunto si existe o no? ¿O está bien hacer algo como el siguiente código? Creo que Java estaría haciendo la comprobación .contains(value) usando .contains(value) . ¿Qué piensas?

¿Cuál sería la complejidad de Big O en ambos casos considerando que hay n elementos que entran en el conjunto?

import java.util.HashSet; import java.util.Set; public class DuplicateTest { public static void main(String[] args) { // TODO Auto-generated method stub Set<Integer> mySet = new HashSet<Integer>(); mySet.add(10); mySet.add(20); mySet.add(30); mySet.add(40); mySet.add(50); mySet.add(50); mySet.add(50); mySet.add(50); mySet.add(50); mySet.add(50); System.out.println("Contents of the Hash Set :"+mySet); } }


Compare con la documentación API de Set.add(E)

El método add comprueba si el elemento ya está en el Set . Si el elemento ya está presente, entonces el nuevo elemento no se agrega, y el Set permanece sin cambios. En la mayoría de las situaciones, no es necesario verificar nada.

La complejidad del método depende de la implementación concreta de Set que está utilizando.


Está bien no comprobar. Esta es la principal ventaja sobre los Conjuntos de listas, ya que filtrarán automáticamente los duplicados.

HashSet tiene un rendimiento de tiempo constante ( http://docs.oracle.com/javase/8/docs/api/java/util/HashSet.html )

Esta clase ofrece un rendimiento de tiempo constante para las operaciones básicas (agregar, eliminar, contener y tamaño), asumiendo que la función de dispersión (hash) dispersa los elementos correctamente entre los cubos.


La función de agregar devuelve un valor booleano que puede verificar para determinar si el elemento ya estaba en el Conjunto. Por supuesto, esto se basa en sus necesidades y no es una buena práctica. Es bueno saber que no eliminará un elemento que ya está allí, por lo que no se puede depender de él para actualizar el valor existente con información nueva si está definiendo iguales en función de claves sustitutas de su base de datos. Esto es opuesto a la forma en que los mapas funcionan como un mapa devolverá cualquier valor existente y lo reemplazará con el nuevo valor.


Según los docs :

public boolean add(E e)

Agrega el elemento especificado a este conjunto si aún no está presente. Más formalmente, agrega el elemento e especificado a este conjunto si este 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.

Entonces el método add() ya te devuelve un verdadero o un falso. Así que no necesitas hacer el cheque adicional.