java howto ArrayList push, pop, shift i unshift

88

Ustaliłem, że Java ArrayList.addjest podobna do JavaScriptArray.push

Utknąłem na szukaniu ArrayListfunkcji podobnych do poniższych

  • Array.pop
  • Array.shift
  • Array.unshift Pochylam się w kierunku ArrayList.remove[At]
Jacksonkr
źródło

Odpowiedzi:

142

ArrayListjest wyjątkowy pod względem standardów nazewnictwa. Oto równoważności:

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

Zauważ, że unshiftnie usuwa elementu, ale zamiast tego dodaje go do listy. Zwróć również uwagę, że zachowania przypadków narożnych mogą być różne w Javie i JS, ponieważ każdy z nich ma swoje własne standardy.

Jon Egeland
źródło
9
Jeśli wykonujesz dużo "niezmienności", ale nie docierasz zbyt często do średnich indeksów, może się okazać, że ArrayList jest gorszy od LinkedList pod względem rzeczywistych czasów działania.
Patrick
while (Item item = items.remove (0)) {...} nie jest równoznaczne z przesunięciem.
e-info128
O co chodzi .push?
jameshfisher
1
PO powiedział, że wiedział Array.push -> ArrayList.add, a specjalnie poprosił o pop, shifti unshift. Czytając to jeszcze raz, dodam więcej wyjaśnień i dodam .pushw tym samym czasie.
Jon Egeland,
Mimo że nie został zadany, ta odpowiedź wydaje się niekompletna bez wzmianki o złożoności tych funkcji.
Jasper
25

Miałem z tym problemem jakiś czas temu i stwierdziłem, że java.util.LinkedListjest najlepszy dla mojego przypadku. Ma kilka metod z różnymi nazwami, ale robią to, co jest potrzebne:

push()    -> LinkedList.addLast(); // Or just LinkedList.add();
pop()     -> LinkedList.pollLast();
shift()   -> LinkedList.pollFirst();
unshift() -> LinkedList.addFirst();
Wirone
źródło
1
Dlaczego nie jest to akceptowane ?! Uwaga: LinkeListdodaje metody, które byłyby bardzo nieefektywne na ArrayList do Listinterfejsu, to było to, co mnie mylić. Te metody pochodzą z interfejsów Dequei Queue, które implementuje, ale ArrayListtak nie jest.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
@CiroSantilli 新疆 改造 中心 六四 事件 法轮功 ale jak bardzo nieefektywne?
Slava
@Slava O (n) vs O (1) dla przedniej wkładki, która jest ogromna.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
3
@CiroSantilli 新疆 改造 中心 六四 事件 法轮功 O (n) i O (1) to po prostu złożoność. Słyszałem, że listy połączone mogą być dość wolniejsze niż listy tablicowe, nawet w przypadku wstawiania / usuwania. stackoverflow.com/questions/34170566/… Więc zastanawiam się, co z Javą?
Slava
14

może chcesz wziąć udział w java.util.Stackklasie look . ma metody push, pop. i zaimplementowany interfejs List.

w przypadku zmiany / cofnięcia zmiany możesz odwołać się do odpowiedzi @ Jona.

jednak coś z ArrayList, o które możesz chcieć się troszczyć, arrayList nie jest zsynchronizowana. ale Stack jest. (podklasa Vector). Jeśli masz wymaganie dotyczące bezpieczeństwa wątków, Stack może być lepszy niż ArrayList.

Kent
źródło
Moja wina, właśnie zdałem sobie sprawę, że w stanie braku snu nie przeczytałem ostatniej połowy.
MJ Rayburn,
3

Świetna odpowiedź Jon .

Jestem jednak leniwy i nienawidzę pisania, więc stworzyłem prosty przykład wycinania i wklejania dla wszystkich innych ludzi, którzy są tacy jak ja. Cieszyć się!

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
źródło
2

Biblioteka Underscore-java zawiera metody push (wartości), pop (), shift () i unshift (wartości).

Przykład kodu:

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
źródło