233 votes

Java ArrayList : comment ajouter des éléments au début ?

J'ai besoin d'ajouter des éléments à un ArrayList queue peu importe, mais lorsque j'appelle la fonction pour ajouter un élément, je veux qu'elle ajoute l'élément au début du tableau (il a donc l'indice le plus bas) et si le tableau a 10 éléments, l'ajout d'un nouvel élément entraîne la suppression de l'élément le plus ancien (celui qui a l'indice le plus élevé).

Quelqu'un a-t-il des suggestions à faire ?

383voto

Baz Points 17236

List a la méthode add(int, E) pour que vous puissiez l'utiliser :

list.add(0, yourObject);

Ensuite, vous pouvez supprimer le dernier élément avec :

if(list.size() > 10)
    list.remove(list.size() - 1);

Cependant, vous pourriez vouloir repenser vos exigences ou utiliser une structure de données différente, comme une Queue

EDIT

Peut-être que vous pouvez jeter un coup d'oeil à la page d'Apache CircularFifoQueue :

CircularFifoQueue est une file d'attente de type "premier entré, premier sorti" de taille fixe qui remplace son élément le plus ancien s'il est plein.

Il suffit de l'initialiser avec votre taille maximale :

CircularFifoQueue queue = new CircularFifoQueue(10);

34voto

for3st Points 2727

Utilisation de structures de données spécifiques

Il existe plusieurs structures de données qui sont optimisées pour l'ajout d'éléments au premier indice. Gardez cependant à l'esprit que si vous convertissez votre collection en l'une d'entre elles, la conversation aura probablement une complexité temporelle et spatiale de O(n)

Deque

Le JDK inclut le Deque qui offre des méthodes comme addFirst(e) y offerFirst(e)

Deque<String> deque = new LinkedList<>();
deque.add("two");
deque.add("one");
deque.addFirst("three");
//prints "three", "two", "one"

Analyse

La complexité spatiale et temporelle de l'insertion est avec LinkedList constante ( O(1) ). Voir le L'antisèche Big-O .

Inverser la liste

Une méthode très simple mais inefficace consiste à utiliser la marche arrière :

 Collections.reverse(list);
 list.add(elementForTop);
 Collections.reverse(list);

Si vous utilisez des flux Java 8, cette réponse pourrait vous intéresser.

Analyse

  • Complexité du temps : O(n)
  • Complexité de l'espace : O(1)

En regardant le Mise en œuvre du JDK ce qui a un O(n) La complexité temporelle ne convient donc qu'aux très petites listes.

10voto

npinti Points 26029

Vous pouvez jeter un coup d'œil à la add(int index, E element) :

Insère l'élément spécifié à la position spécifiée dans cette liste. Déplace l'élément actuellement à cette position (s'il y en a un) et tous les éléments suivants vers la droite (ajoute un à leurs indices). éléments suivants vers la droite (ajoute un à leurs indices).

Une fois l'ajout effectué, vous pouvez alors vérifier la taille de la liste de tableaux et supprimer ceux qui se trouvent à la fin.

6voto

Evvo Points 11

Vous pouvez vous intéresser à Deque, qui vous donne un accès direct au premier et au dernier élément de la liste.

4voto

Rohit Jain Points 90368

Ce que vous décrivez, est une situation appropriée pour utiliser Queue .

Puisque vous voulez add nouvel élément, et remove l'ancien. Vous pouvez ajouter à la fin, et enlever du début. Cela ne fera pas une grande différence.

La file d'attente a des méthodes add(e) y remove() qui ajoute à la fin le nouvel élément, et retire du début l'ancien élément, respectivement.

Queue<Integer> queue = new LinkedList<Integer>();
queue.add(5);
queue.add(6);
queue.remove();  // Remove 5

Ainsi, à chaque fois que vous ajoutez un élément au queue vous pouvez l'étayer avec un remove l'appel de la méthode.


UPDATE : -

Et si vous voulez pour fixer la taille de la Queue alors vous pouvez jeter un coup d'œil à : - ApacheCommons#CircularFifoBuffer

De la documentation : -

CircularFifoBuffer est un tampon "premier entré, premier sorti" de taille fixe. qui remplace l'élément le plus ancien s'il est plein.

Buffer queue = new CircularFifoBuffer(2); // Max size

queue.add(5);
queue.add(6);
queue.add(7);  // Automatically removes the first element `5`

Comme vous pouvez le constater, lorsque la taille maximale est atteinte, l'ajout d'un nouvel élément supprime automatiquement le premier élément inséré.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X