Eu preciso adicionar elementos a um ArrayList
fila, mas quando chamo a função para adicionar um elemento, quero que adicione o elemento no início da matriz (para que tenha o índice mais baixo) e se a matriz tiver 10 elementos adicionando um novo resulta na exclusão do elemento mais antigo (aquele com o índice mais alto).
Alguém tem alguma sugestão?
remove
eadd
?arraylist stack queue whatever
para adicionar ao início de uma matriz é melhor evitar e parece que você deve usar uma coleção diferente.Respostas:
List
tem o métodoadd(int, E)
, então você pode usar:Depois, você pode excluir o último elemento com:
No entanto, convém repensar seus requisitos ou usar uma estrutura de dados diferente, como um
Queue
EDITAR
Talvez dê uma olhada no Apache
CircularFifoQueue
:Apenas inicialize com seu tamanho máximo:
fonte
Usando estruturas de dados específicas
Existem várias estruturas de dados que são otimizadas para adicionar elementos no primeiro índice. No entanto, lembre-se de que, se você converter sua coleção para uma delas, a conversa provavelmente precisará de uma complexidade de tempo e espaço de
O(n)
Deque
O JDK inclui a
Deque
estrutura que oferece métodos comoaddFirst(e)
eofferFirst(e)
Análise
A complexidade do espaço e do tempo de inserção é
LinkedList
constante (O(1)
). Veja a folha de dicas do Big-O .Invertendo a lista
Um método muito fácil, mas ineficiente, é usar reverse:
Se você usa fluxos Java 8, esta resposta pode lhe interessar.
Análise
O(n)
O(1)
Olhando para a implementação do JDK, isso tem uma
O(n)
complexidade de tempo, sendo adequado apenas para listas muito pequenas.fonte
Você pode dar uma olhada no add (int index, elemento E) :
Depois de adicionar, você pode verificar o tamanho do ArrayList e removê-los no final.
fonte
Você pode querer olhar para Deque. fornece acesso direto ao primeiro e ao último itens da lista.
fonte
O que você está descrevendo é uma situação apropriada para usar
Queue
.Desde que você deseja
add
novo elemento, eremove
o antigo. Você pode adicionar no final e remover do início. Isso não fará muita diferença.A fila possui métodos
add(e)
eremove()
que adiciona ao final o novo elemento e remove desde o início o elemento antigo, respectivamente.Portanto, toda vez que você adiciona um elemento ao
queue
você pode fazer backup com umaremove
chamada de método.ATUALIZAÇÃO : -
E se você quiser corrigir o tamanho do
Queue
, poderá dar uma olhada em: -ApacheCommons#CircularFifoBuffer
Desde
documentation
: -Como você pode ver, quando o tamanho máximo é atingido, a adição de um novo elemento remove automaticamente o primeiro elemento inserido.
fonte
Eu acho que o implemento deve ser fácil, mas considerando a eficiência, você deve usar o LinkedList, mas não o ArrayList como contêiner. Você pode consultar o seguinte código:
fonte
O Java LinkedList fornece os métodos addFirst (E e) e push (E e) que adicionam um elemento à frente da lista.
https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html#addFirst(E)
fonte
você pode usar esse código
fonte
Você pode usar métodos de lista, remover e adicionar
fonte
Veja este exemplo: -
fonte
Você pode usar
Mude E com seu tipo de dados
Se a exclusão do elemento mais antigo for necessária, você poderá adicionar:
antes da declaração de retorno. Caso contrário, a lista adicionará seu objeto no início e também manterá o elemento mais antigo.
Isso excluirá o último elemento da lista.
fonte
fonte
Eu tive um problema semelhante, tentando adicionar um elemento no início de uma matriz existente, mudar os elementos existentes para a direita e descartar o mais antigo (matriz [comprimento-1]). Minha solução pode não ter muito desempenho, mas funciona para meus propósitos.
Boa sorte
fonte