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 elMapIterator
. 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 usandoCollections.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 conIdentityHashMap
,
CaseInsensitiveMap
, o mapas similares que incumplan el contrato general deMap
. losListOrderedMap
(o, más precisamente, el subyacenteList
) está confiando enequals()
. Esto está bien, siempre y cuando el decoradoMap
también se basa enequals()
, yhashCode()
, cualesIdentityHashMap
, yCaseInsensitiveMap
no: el primero usa==
, y este último usaequals()
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.