Java howto ArrayList push, pop, shift y unshift

88

He determinado que Java ArrayList.addes similar a JavaScriptArray.push

Estoy atascado en la búsqueda de ArrayListfunciones similares a las siguientes

  • Array.pop
  • Array.shift
  • Array.unshift Me estoy inclinando hacia ArrayList.remove[At]
Jacksonkr
fuente

Respuestas:

142

ArrayListes único en sus estándares de nombres. Aquí están las equivalencias:

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

Tenga en cuenta que unshiftno elimina un elemento, sino que agrega uno a la lista. También tenga en cuenta que es probable que los comportamientos de casos de esquina sean diferentes entre Java y JS, ya que cada uno tiene sus propios estándares.

Jon Egeland
fuente
9
Si está haciendo muchos "cambios" pero no mucho para llegar a índices medios, puede encontrar que ArrayList es inferior a LinkedList en términos de tiempos de ejecución reales.
Patrick
while (Item item = items.remove (0)) {...} no es equivalente a shift.
e-info128
¿Qué hay de .push?
jameshfisher
1
OP dijo que no sabía Array.push -> ArrayList.add, y le preguntó específicamente sobre pop, shifty unshift. Al leer esto nuevamente, voy a agregar más explicación y agregar .pushal mismo tiempo.
Jon Egeland
Aunque no se preguntó, esta respuesta se siente incompleta sin mencionar la complejidad de estas funciones.
Jasper
25

Me enfrenté a este problema hace algún tiempo y descubrí que java.util.LinkedListes lo mejor para mi caso. Tiene varios métodos, con diferentes nombres, pero están haciendo lo que se necesita:

push()    -> LinkedList.addLast(); // Or just LinkedList.add();
pop()     -> LinkedList.pollLast();
shift()   -> LinkedList.pollFirst();
unshift() -> LinkedList.addFirst();
Wirone
fuente
1
¿Por qué no se acepta esto? Nota: LinkeListagrega métodos que serían muy ineficientes en ArrayList la Listinterfaz, esto fue lo que me confundió. Estos métodos provienen de las interfaces Dequey Queueque implementa, pero ArrayListno lo hace.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
@CiroSantilli 新疆 改造 中心 六四 事件 法轮功 pero ¿qué tan ineficiente?
Slava
@Slava O (n) vs O (1) para el inserto frontal, que es enorme.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
3
@CiroSantilli 新疆 改造 中心 六四 事件 法轮功 O (n) y O (1) son solo complejidades. Escuché que las listas vinculadas pueden ser bastante más lentas que las listas de matrices, incluso para inserciones / eliminaciones. stackoverflow.com/questions/34170566/… Entonces me pregunto, ¿qué pasa con Java?
Slava
14

tal vez quieras echar un vistazo a la java.util.Stackclase. tiene métodos push, pop. e implementó la interfaz de lista.

para shift / unshift, puede hacer referencia a la respuesta de @ Jon.

sin embargo, algo de ArrayList que puede interesarle, arrayList no está sincronizado. pero Stack lo es. (subclase de Vector). Si tiene un requisito de seguridad para subprocesos, Stack puede ser mejor que ArrayList.

Kent
fuente
Mi mal, me acabo de dar cuenta de que en mi estado de falta de sueño no leí la última mitad.
MJ Rayburn
3

Gran respuesta de Jon .

Sin embargo, soy vago y odio escribir, así que creé un ejemplo simple de cortar y pegar para todas las demás personas que son como yo. ¡Disfrutar!

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

La biblioteca Underscore-java contiene los métodos push (valores), pop (), shift () y unshift (valores).

Ejemplo 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
fuente