java howto ArrayList push, pop, shift et unshift

88

J'ai déterminé qu'un Java ArrayList.addest similaire à un JavaScriptArray.push

Je n'arrive pas à trouver des ArrayListfonctions similaires aux suivantes

  • Array.pop
  • Array.shift
  • Array.unshift Je me penche vers ArrayList.remove[At]
Jacksonkr
la source

Réponses:

142

ArrayListest unique dans ses normes de dénomination. Voici les équivalences:

Array.push    -> ArrayList.add(Object o); // Append the list
Array.pop     -> ArrayList.remove(int index); // Remove list[index]
Array.shift   -> ArrayList.remove(0); // Remove first element
Array.unshift -> ArrayList.add(int index, Object o); // Prepend the list

Notez que unshiftcela ne supprime pas un élément, mais en ajoute un à la liste. Notez également que les comportements de cas d'angle sont susceptibles d'être différents entre Java et JS, car ils ont chacun leurs propres normes.

Jon Egeland
la source
9
Si vous faites beaucoup de "décalage" mais pas beaucoup pour atteindre les indices intermédiaires, vous pouvez trouver que ArrayList est inférieur à LinkedList en termes de temps d'exécution réels.
Patrick
while (Item item = items.remove (0)) {...} n'est pas équivalent à shift.
e-info128
Et quoi .push?
jameshfisher
1
OP a dit qu'il savait Array.push -> ArrayList.add, et plus précisément posé des questions sur pop, shiftet unshift. En relisant ceci, je vais ajouter plus d'explications et ajouter .pushen même temps.
Jon Egeland
Même si elle n'a pas été posée, cette réponse semble incomplète sans aucune mention de la complexité de ces fonctions.
Jasper
25

J'étais confronté à ce problème il y a quelque temps et j'ai trouvé que c'était java.util.LinkedListmieux pour mon cas. Il a plusieurs méthodes, avec des noms différents, mais ils font ce qui est nécessaire:

push()    -> LinkedList.addLast(); // Or just LinkedList.add();
pop()     -> LinkedList.pollLast();
shift()   -> LinkedList.pollFirst();
unshift() -> LinkedList.addFirst();
Wirone
la source
1
Pourquoi n'est-ce pas accepté?! Remarque: LinkeListajoute des méthodes qui seraient très inefficaces sur ArrayList l' Listinterface, c'est ce qui m'a dérouté. Ces méthodes proviennent des interfaces Dequeet Queuequ'elle implémente, mais ArrayListpas.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
@CiroSantilli 新疆 改造 中心 六四 事件 法轮功 mais combien inefficace?
Slava
@Slava O (n) vs O (1) pour l'insertion avant, ce qui est énorme.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
3
@CiroSantilli 新疆 改造 中心 六四 事件 法轮功 O (n) et O (1) ne sont que des complexités. J'ai entendu dire que les listes liées peuvent être assez lentes que les listes de tableaux, même pour les insertions / suppressions. stackoverflow.com/questions/34170566/... Alors je me demande, qu'en est-il de Java?
Slava
14

peut-être que vous voulez prendre un cours de look java.util.Stack. il a des méthodes push, pop. et implémentation de l'interface de liste.

pour shift / unshift, vous pouvez référencer la réponse de @ Jon.

cependant, quelque chose de ArrayList dont vous voudrez peut-être vous soucier, arrayList n'est pas synchronisé. mais Stack l'est. (sous-classe de Vector). Si vous avez besoin de thread-safe, Stack peut être meilleur que ArrayList.

Kent
la source
Mon mal, je viens de réaliser que dans mon état de manque de sommeil, je n'ai pas lu la dernière moitié.
MJ Rayburn
3

Excellente réponse de Jon .

Je suis paresseux et je déteste taper, alors j'ai créé un exemple simple de copier-coller pour toutes les autres personnes qui sont comme moi. Prendre plaisir!

import java.util.ArrayList;
import java.util.List;

public class Main {

    public static void main(String[] args) {

        List<String> animals = new ArrayList<>();

        animals.add("Lion");
        animals.add("Tiger");
        animals.add("Cat");
        animals.add("Dog");

        System.out.println(animals); // [Lion, Tiger, Cat, Dog]

        // add() -> push(): Add items to the end of an array
        animals.add("Elephant");
        System.out.println(animals);  // [Lion, Tiger, Cat, Dog, Elephant]

        // remove() -> pop(): Remove an item from the end of an array
        animals.remove(animals.size() - 1);
        System.out.println(animals); // [Lion, Tiger, Cat, Dog]

        // add(0,"xyz") -> unshift(): Add items to the beginning of an array
        animals.add(0, "Penguin");
        System.out.println(animals); // [Penguin, Lion, Tiger, Cat, Dog]

        // remove(0) -> shift(): Remove an item from the beginning of an array
        animals.remove(0);
        System.out.println(animals); // [Lion, Tiger, Cat, Dog]

    }

}
Adrian Smith
la source
2

La bibliothèque Underscore-java contient les méthodes push (valeurs), pop (), shift () et unshift (valeurs).

Exemple de code:

import com.github.underscore.U:

List<String> strings = Arrays.asList("one", "two", " three");
List<String> newStrings = U.push(strings, "four", "five");
// ["one", " two", "three", " four", "five"]
String newPopString = U.pop(strings).fst();
// " three"
String newShiftString = U.shift(strings).fst();
// "one"
List<String> newUnshiftStrings = U.unshift(strings, "four", "five");
// ["four", " five", "one", " two", "three"]
Valentyn Kolesnikov
la source