java howto ArrayList push, pop, shift e unshift

89

Eu determinei que um Java ArrayList.addé semelhante a um JavaScriptArray.push

Estou preso em encontrar ArrayListfunções semelhantes às seguintes

  • Array.pop
  • Array.shift
  • Array.unshift Estou inclinado para ArrayList.remove[At]
Jacksonkr
fonte

Respostas:

145

ArrayListé único em seus padrões de nomenclatura. Aqui estão as equivalências:

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

Observe que unshiftnão remove um elemento, mas adiciona um à lista. Observe também que os comportamentos de casos secundários provavelmente são diferentes entre Java e JS, já que cada um tem seus próprios padrões.

Jon Egeland
fonte
9
Se você estiver fazendo muito "unshifting", mas não muito para chegar aos índices intermediários, pode achar que ArrayList é inferior a LinkedList em termos de tempos de execução reais.
Patrick
while (Item item = items.remove (0)) {...} não é equivalente a shift.
e-info128
Sobre o quê .push?
jameshfisher
1
OP disse que sabia Array.push -> ArrayList.add, e especificamente perguntou sobre pop, shifte unshift. Lendo isso novamente, vou adicionar mais explicação e adicionar .pushao mesmo tempo.
Jon Egeland
Mesmo que não tenha sido perguntado, esta resposta parece incompleta sem qualquer menção à complexidade dessas funções.
Jasper
25

Eu estava enfrentando esse problema há algum tempo e descobri que java.util.LinkedListé o melhor para o meu caso. Tem vários métodos, com nomes diferentes, mas estão fazendo o que é necessário:

push()    -> LinkedList.addLast(); // Or just LinkedList.add();
pop()     -> LinkedList.pollLast();
shift()   -> LinkedList.pollFirst();
unshift() -> LinkedList.addFirst();
Wirone
fonte
1
Por que isso não é aceito ?! Nota: LinkeListadiciona métodos que seria muito ineficiente na ArrayList à Listinterface, isto era o que me confundiu. Esses métodos vêm das interfaces Dequee Queueque ele implementa, mas ArrayListnão.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
@CiroSantilli 新疆 改造 中心 六四 事件 法轮功 mas quanto ineficiente?
Slava
@Slava O (n) vs O (1) para inserção frontal, que é enorme.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
3
@CiroSantilli 新疆 改造 中心 六四 事件 法轮功 O (n) e O (1) são apenas complexidades. Ouvi dizer que as listas vinculadas podem ser bem mais lentas que as listas de array, mesmo para inserções / exclusões. stackoverflow.com/questions/34170566/… Então eu me pergunto, e o Java?
Slava
15

talvez você queira dar uma olhada na java.util.Stackclasse. tem métodos push e pop. e interface de lista implementada.

para shift / unshift, você pode consultar a resposta de @Jon.

no entanto, algo de ArrayList com o qual você pode querer se preocupar, arrayList não está sincronizado. mas Stack é. (subclasse de Vector). Se você tiver um requisito de thread-safe, Stack pode ser melhor do que ArrayList.

Kent
fonte
Que pena, acabei de perceber que no meu estado de privação de sono não li a última metade.
MJ Rayburn
3

Excelente resposta de Jon .

Eu sou preguiçoso e odeio digitar, então criei um exemplo simples de recortar e colar para todas as outras pessoas que são como eu. Apreciar!

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
fonte
2

A biblioteca Underscore-java contém os métodos push (valores), pop (), shift () e unshift (valores).

Exemplo de código:

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
fonte