recorrer implementar example entre ejemplos ejemplo diferencia como java arrays performance hashmap asymptotic-complexity

implementar - recorrer hashmap java foreach



¿Es una buena idea almacenar datos como claves en HashMap con valores vacíos/nulos? (2)

Como tiene un conjunto de valores únicos, un Set es la estructura de datos adecuada. Puede poner sus valores dentro de HashSet , una implementación de la interfaz Set .

Mi líder dijo que esta era una manera más eficiente de hacer esto y tenía sentido para mí, pero parecía un poco desagradable poner valores nulos / vacíos como valores en el mapa hash y almacenar elementos como claves.

El consejo del plomo es defectuoso. Map no es la abstracción correcta para esto, Set . Un Map es apropiado para pares clave-valor. Pero no tienes valores, solo claves.

Ejemplo de uso:

Set<String> users = new HashSet<>(Arrays.asList("Alice", "Bob")); System.out.println(users.contains("Alice")); // -> prints true System.out.println(users.contains("Jack")); // -> prints false

Usar un Map sería incómodo, porque ¿cuál debería ser el tipo de los valores? Esa pregunta no tiene sentido en su caso de uso, ya que solo tiene claves, no pares clave-valor. Con un Set , no necesita preguntar eso, el uso es perfectamente natural.

Esto es O (1) ¿verdad?

Sí, buscar en un HashMap o un HashSet es O (1) peor caso amortizado, mientras que buscar en una List o una matriz es O (n) el peor caso.

Algunos comentarios señalan que un HashSet se implementa en términos de HashMap . Eso está bien, en ese nivel de abstracción . En el nivel de abstracción de la tarea en cuestión, almacenar una colección de nombres de usuario únicos, usar un conjunto es una elección natural, más natural que un mapa.

Originalmente había escrito una ArrayList y almacenaba valores únicos (nombres de usuario, es decir, Strings ) en ella. Más tarde necesité usar ArrayList para buscar si existía un usuario en ella. Eso es O(n) para la búsqueda.

Mi líder técnico quería que cambiara eso a un HashMap y almacenara los nombres de usuario como claves en la matriz y los valores como Strings vacías.

Entonces, en Java:

hashmap.put("johndoe","");

Puedo ver si este usuario existe más tarde ejecutando -

hashmap.containsKey("johndoe");

Esto es O(1) ¿verdad?

Mi líder dijo que esta era una manera más eficiente de hacer esto y tenía sentido para mí, pero parecía un poco desagradable poner valores nulos / vacíos como valores en el mapa hash y almacenar elementos como claves.

Mi pregunta es, ¿es este un buen enfoque? La eficiencia supera a ArrayList#contains o una búsqueda de matriz en general. Funciona. Mi preocupación es que no he visto a nadie más hacer esto después de una búsqueda. Puede que me esté perdiendo un problema obvio en alguna parte, pero no puedo verlo.


Esto es básicamente cómo se implementa HashSet , así que supongo que se puede decir que es un buen enfoque. También podría usar HashSet lugar de su HashMap con valores vacíos.

Por ejemplo :

La implementación de add de HashSet es

public boolean add(E e) { return map.put(e, PRESENT)==null; }

donde map es el HashMap respaldo y PRESENT es un valor ficticio.

Mi preocupación es que no he visto a nadie más hacer esto después de una búsqueda. Puede que me esté perdiendo un problema obvio en alguna parte, pero no puedo verlo.

Como mencioné, los desarrolladores del JDK están utilizando este mismo enfoque.