Tableaux Java comment ajouter des éléments au début

J'ai besoin d'ajouter des éléments à une file d'attente ArrayList, mais quand j'appelle la fonction pour ajouter un élément, je veux qu'elle ajoute l'élément au début du tableau (donc il a l'index le plus bas) et si le tableau a 10 éléments Ajouter un nouveau entraîne la suppression de l'élément le plus ancien (celui avec

Quelqu'un a-t-il des suggestions?

124
demandé sur Baz 2012-10-18 11:52:43

12 réponses

List a la méthode add(int, E), de sorte que vous pouvez utiliser:

list.add(0, yourObject);

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

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

Cependant, vous pouvez repenser vos besoins ou utiliser une structure de données différente, commeQueue

Modifier

Peut-être avoir un coup d'oeil à Apache CircularFifoQueue:

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

Juste initialisez-le avec votre taille maximale:

CircularFifoQueue queue = new CircularFifoQueue(10);
216
répondu Baz 2016-10-14 07:52:28

Utilisation De Structures De Données Spécifiques

Il existe différentes structures de données qui sont optimisées pour ajouter des éléments au premier index. Rappelez-vous cependant que si vous convertissez votre collection à l'une d'entre elles, la conversation aura probablement besoin d'une complexité temporelle et spatiale de O(n)

Deque

Le JDK comprend l'Deque structure qui propose des méthodes comme addFirst(e) et offerFirst(e)

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

Analyse

Espace et temps la complexité de l'insertion est avec LinkedList constante (O(1)). Voir la Big-O triche.

Inverser la liste

Une méthode très facile mais inefficace consiste à utiliser reverse:

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

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

Analyse

  • Complexité Temporelle: O(n)
  • Complexité De L'Espace: O(1)

En regardant l'implémentation JDK cela a une complexité temporelle O(n) donc seulement convient pour de très petites listes.

20
répondu for3st 2017-12-03 15:47:07

Vous pouvez jeter un oeil à l'élément add (int index, E):

Insère l'élément spécifié à la position spécifiée dans cette liste. Déplace l'élément actuellement à cette position (le cas échéant) éléments suivants à droite (ajoute un à leurs indices).

Une fois que vous ajoutez, vous pouvez ensuite vérifier la taille de L'ArrayList et supprimer celles à la fin.

8
répondu npinti 2012-10-18 07:57:18

Vous pouvez regarder Deque. il vous donne un accès direct aux premier et dernier éléments de la liste.

4
répondu Evvo 2016-06-30 13:10:47

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

Puisque vous voulez add élément nouveau, et remove l'ancien. Vous pouvez ajouter à la fin, et supprimer du début. Cela ne fera pas beaucoup de différence.

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

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

Donc, chaque fois que vous ajoutez un élément à l' queue, vous pouvez le sauvegarder avec un remove appel de méthode.


Mise à jour: -

Et si vous voulez pour fixer la taille de la Queue, ensuite, vous pouvez prendre un coup d'oeil à: - ApacheCommons#CircularFifoBuffer

À Partir de la documentation: -

CircularFifoBuffer est un tampon first in first out de taille fixe cela remplace son é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 voir, lorsque la taille maximale est atteinte, l'ajout d'un nouvel élément supprime automatiquement la première élément inséré.

3
répondu Rohit Jain 2012-10-18 08:18:19

Je pense que l'implémentation devrait être facile, mais compte tenu de l'efficacité, vous devriez utiliser LinkedList mais pas ArrayList comme conteneur. Vous pouvez vous référer au code suivant:

import java.util.LinkedList;
import java.util.List;

public class DataContainer {

    private List<Integer> list;

    int length = 10;
    public void addDataToArrayList(int data){
        list.add(0, data);
        if(list.size()>10){
            list.remove(length);
        }
    }

    public static void main(String[] args) {
        DataContainer comp = new DataContainer();
        comp.list = new LinkedList<Integer>();

        int cycleCount = 100000000;

        for(int i = 0; i < cycleCount; i ++){
            comp.addDataToArrayList(i);
        }
    }
}
2
répondu feikiss 2013-09-11 10:05:34

Java LinkedList fournit à la fois la méthode addFirst(E e) et la méthode push(E e) qui ajoutent un élément au début de la liste.

Https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html#addFirst(E)

2
répondu Josh Grill 2017-02-14 06:18:14

Vous pouvez utiliser ce code

private List myList = new ArrayList();
private void addItemToList(Object obj){
    if(myList.size()<10){
      myList.add(0,obj);
    }else{
      myList.add(0,obj);
      myList.remove(10);
    }
}
1
répondu MaVRoSCy 2012-10-18 08:01:00

Vous pouvez utiliser

public List<E> addToListStart(List<E> list, E obj){
list.add(0,obj);
return (List<E>)list;

}

Changez E avec votre type de données

Si la suppression de l'élément le plus ancien est nécessaire, vous pouvez ajouter:

list.remove(list.size()-1); 

Avant la déclaration de retour. Sinon list ajoutera votre objet au début et conservera également l'élément le plus ancien.

Cela supprimera le dernier élément de la liste.

0
répondu a Learner 2012-10-18 08:15:38

Vous pouvez utiliser les méthodes list, supprimer et ajouter

list.add(lowestIndex, element);
list.remove(highestIndex, element);
0
répondu Alice 2016-03-18 16:24:55

, j'ai eu un problème similaire, en essayant d'ajouter un élément au début d'un tableau existant, déplacer les éléments vers la droite et jetez la plus ancienne (tableau[longueur-1]). Ma solution pourrait ne pas être très performante mais cela fonctionne pour mes besoins.

 Method:

   updateArray (Element to insert)

     - for all the elements of the Array
       - start from the end and replace with the one on the left; 
     - Array [0] <- Element

Bonne chance

0
répondu FabianCid 2017-08-09 17:38:01
import java.util.*:
public class Logic {
  List<String> list = new ArrayList<String>();
  public static void main(String...args) {
  Scanner input = new Scanner(System.in);
    Logic obj = new Logic();
      for (int i=0;i<=20;i++) {
        String string = input.nextLine();
        obj.myLogic(string);
        obj.printList();
      }
 }
 public void myLogic(String strObj) {
   if (this.list.size()>=10) {
      this.list.remove(this.list.size()-1);
   } else {
     list.add(strObj); 
   }
 }
 public void printList() {
 System.out.print(this.list);
 }
}
0
répondu Machhindra Neupane 2018-09-25 05:22:18