Necesito agregar elementos a una ArrayList
cola, pero cuando llamo a la función para agregar un elemento, quiero que agregue el elemento al comienzo de la matriz (por lo que tiene el índice más bajo) y si la matriz tiene 10 elementos agregando un nuevo resultado elimina el elemento más antiguo (el que tiene el índice más alto).
¿Alguien tiene alguna sugerencia?
remove
yadd
?arraylist stack queue whatever
para agregar al inicio de una matriz, es mejor evitarlo y parece que debería estar usando una colección diferente.Respuestas:
List
tiene el métodoadd(int, E)
, por lo que puede usar:Luego puede eliminar el último elemento con:
Sin embargo, es posible que desee repensar sus requisitos o utilizar una estructura de datos diferente, como un
Queue
EDITAR
Quizás eche un vistazo a Apache
CircularFifoQueue
:Simplemente inicialícelo con su tamaño máximo:
fuente
Usar estructuras de datos específicas
Existen varias estructuras de datos que están optimizadas para agregar elementos en el primer índice. Sin embargo, tenga en cuenta que si convierte su colección en una de estas, la conversación probablemente necesitará una complejidad de tiempo y espacio de
O(n)
Deque
El JDK incluye la
Deque
estructura que ofrece métodos comoaddFirst(e)
yofferFirst(e)
Análisis
La complejidad de inserción en el espacio y el tiempo es con
LinkedList
constante (O(1)
). Ver la hoja de trucos Big-O .Revertir la lista
Un método muy fácil pero ineficiente es usar el reverso:
Si usa secuencias Java 8, esta respuesta podría interesarle.
Análisis
O(n)
O(1)
Al observar la implementación de JDK, esto tiene una
O(n)
complejidad temporal, por lo que solo es adecuado para listas muy pequeñas.fuente
Puede echar un vistazo a add (int index, E element) :
Una vez que agregue, puede verificar el tamaño de ArrayList y eliminar los que están al final.
fuente
Es posible que desee mirar Deque. le brinda acceso directo al primer y último elemento de la lista.
fuente
Lo que está describiendo es una situación apropiada para usar
Queue
.Ya que quieres un
add
elemento nuevo, yremove
el viejo. Puede agregar al final y eliminar desde el principio. Eso no hará mucha diferencia.Queue tiene métodos
add(e)
yremove()
que agrega al final el nuevo elemento, y elimina desde el principio el elemento anterior, respectivamente.Por lo tanto, cada vez que agregue un elemento al
queue
puede respaldarlo con unaremove
llamada al método.ACTUALIZACIÓN : -
Y si desea corregir el tamaño de la
Queue
, entonces puede echar un vistazo a: -ApacheCommons#CircularFifoBuffer
De la
documentation
: -Como puede ver, cuando se alcanza el tamaño máximo, al agregar un nuevo elemento, se elimina automáticamente el primer elemento insertado.
fuente
Creo que la implementación debería ser fácil, pero teniendo en cuenta la eficiencia, debe usar LinkedList pero no ArrayList como contenedor. Puede consultar el siguiente código:
fuente
Java LinkedList proporciona los métodos addFirst (E e) y push (E e) que agregan un elemento al principio de la lista.
https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html#addFirst(E)
fuente
puedes usar este código
fuente
Puede usar métodos de lista, eliminar y agregar
fuente
Tome este ejemplo:
fuente
Puedes usar
Cambie E con su tipo de datos
Si es necesario eliminar el elemento más antiguo, puede agregar:
antes de la declaración de devolución. De lo contrario, list agregará su objeto al principio y también retendrá el elemento más antiguo.
Esto eliminará el último elemento en la lista.
fuente
fuente
Tuve un problema similar al intentar agregar un elemento al comienzo de una matriz existente, desplazar los elementos existentes a la derecha y descartar el más antiguo (matriz [longitud-1]). Mi solución puede no ser muy eficiente pero funciona para mis propósitos.
Buena suerte
fuente