Saltar al contenido

¿Cómo agregar un elemento en un índice / posición específica en LinkedHashMap?

Ten en cuenta que en las ciencias un problema casi siempere suele tener diferentes resoluciones, así que mostramos lo más óptimo y eficiente.

Solución:

No se puede cambiar el orden. Está insert-order (por defecto) o access-order con este constructor:

public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)

  • Construye una instancia de LinkedHashMap vacía con la capacidad inicial, el factor de carga y el modo de pedido especificados.

  • Parámetros: initialCapacity – la capacidad inicial loadFactor – el factor de carga accessOrder – el modo de pedido – true para orden de acceso, false para orden de inserción

  • Emite: IllegalArgumentException – si la capacidad inicial es negativa o el factor de carga no es positivo

Ver: LinkedHashMap

Puede hacer este elemento agregando a 1. o al último lugar:

Añadiendo al último lugar ► Solo necesita eliminar la entrada anterior del mapa de esta manera:

map.remove(key);
map.put(key,value);

Sumando al primer lugar ► Es un poco más complicado, necesitas clonar el mapa, borrarlo, ponerle el valor 1. y ponerle el nuevo mapa, así:

Estoy usando mapas con String keys y valores de Grupo (mi clase personalizada):

LinkedHashMap newmap=(LinkedHashMap) map.clone();
map.clear();
map.put(key, value);
map.putAll(newm);

Como puede ver, con estos métodos puede agregar una cantidad ilimitada de cosas al principio y al final del mapa.

Solución Apache Commons: ListOrderedMap

Dado que los JDK LinkedHashMap asegura solo la recuperación del pedido de inserción, en caso de que deseemos insertarlo en un índice, podemos usar alternativamente Apache Commons ‘ ListOrderedMap. Lo hace como suena, al tener una lista para mantener el orden de inserción con el índice correspondiente y un mapa normal para insertar como lo hacemos generalmente. Esto es lo que dicen los doctores:

public class ListOrderedMap
extends AbstractMapDecorator
implements OrderedMap, Serializable

Decora un Map para asegurar que el orden de adición se mantenga usando una Lista para mantener el orden.

La orden se utilizará a través de los iteradores y toArray métodos en las vistas. El pedido también es devuelto por el MapIterator. los
orderedMapIterator() El método accede a un iterador que puede iterar hacia adelante y hacia atrás a través del mapa. Además, se proporcionan métodos sin interfaz para acceder al mapa por índice.

Si un objeto se agrega al mapa por segunda vez, permanecerá en la posición original en la iteración.

Tenga en cuenta que ListOrderedMap no está sincronizado y no es seguro para subprocesos. Si desea utilizar este mapa de varios subprocesos al mismo tiempo, debe utilizar la sincronización adecuada. El enfoque más simple es envolver este mapa usando Collections.synchronizedMap(Map). Esta clase puede generar excepciones cuando se accede a través de subprocesos simultáneos sin sincronización.

Tenga en cuenta que ListOrderedMap no funciona con IdentityHashMap,
CaseInsensitiveMap, o mapas similares que incumplan el contrato general de Map. los ListOrderedMap (o, más precisamente, el subyacente List) está confiando en equals(). Esto está bien, siempre y cuando el decorado Map también se basa en equals(), y hashCode(), cuales IdentityHashMap, y CaseInsensitiveMap no: el primero usa ==, y este último usa equals() en una minúscula key.

Aquí está su implementación para agregar a una posición:

        /**
428     * Puts a key-value mapping into the map at the specified index.
429     * 

430 * If the map already contains the key, then the original mapping 431 * is removed and the new mapping added at the specified index. 432 * The remove may change the effect of the index. The index is 433 * always calculated relative to the original state of the map. 434 *

435 * Thus the steps are: (1) remove the existing key-value mapping, 436 * then (2) insert the new key-value mapping at the position it 437 * would have been inserted had the remove not occurred. 438 * 439 * @param index the index at which the mapping should be inserted 440 * @param key the key 441 * @param value the value 442 * @return the value previously mapped to the key 443 * @throws IndexOutOfBoundsException if the index is out of range [0, size] 444 * @since 3.2 445 */ 446 public V put(int index, final K key, final V value) 447 if (index < 0

No se te olvide compartir este ensayo si te fue útil.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *