Java як виконувати ArrayList push, pop, shift і unshift


88

Я визначив, що Java ArrayList.addсхожа на JavaScriptArray.push

Я застряг у пошуку ArrayListфункцій, подібних до наведених нижче

  • Array.pop
  • Array.shift
  • Array.unshift Я схиляюся до ArrayList.remove[At]

Відповіді:


142

ArrayListунікальний за своїми стандартами іменування. Ось еквівалентності:

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

Зверніть увагу, що елемент unshiftне видаляється , а натомість додається до списку. Також зауважте, що поведінка в різних регіонах, ймовірно, відрізняється між Java та JS, оскільки кожна з них має свої власні стандарти.


9
Якщо ви робите багато "зрушень", але не надто багато отримуєте середні показники, ви можете виявити, що ArrayList поступається LinkedList за фактичним часом роботи.
Патрік

в той час як (Item item = items.remove (0)) {...} не еквівалентно зсуву.
e-info128

Що про .push?
jameshfisher

1
OP сказав , що він знав Array.push -> ArrayList.add, і , в зокрема питання про pop, shiftі unshift. Читаючи це ще раз, я збираюся додати більше пояснень і додати .pushодночасно.
Джон Егеланд,

Незважаючи на те, що її не задавали, ця відповідь здається неповною без жодної згадки про складність цих функцій.
Джаспер

25

Я стикався з цією проблемою деякий час тому і виявив, що java.util.LinkedListце найкраще для мого випадку. Він має кілька методів з різними іменами, але вони роблять те, що потрібно:

push()    -> LinkedList.addLast(); // Or just LinkedList.add();
pop()     -> LinkedList.pollLast();
shift()   -> LinkedList.pollFirst();
unshift() -> LinkedList.addFirst();

1
Чому це не прийнято ?! Примітка: LinkeListдодає ArrayList до Listінтерфейсу методи, які були б дуже неефективними , саме це мене бентежило. Ці методи походять від інтерфейсів Dequeі, Queueякі він реалізує, але ArrayListні.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

1
@CiroSantilli 新疆 改造 中心 六四 事件 法轮功, але наскільки неефективним?
Слава

@Slava O (n) проти O (1) для передньої вставки, яка величезна.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

3
@CiroSantilli 新疆 改造 中心 六四 事件 法轮功 O (n) та O (1) - це просто складності. Я чув, що зв’язані списки можуть бути досить повільнішими за списки масивів навіть для вставок / видалень. stackoverflow.com/questions/34170566/… Тож цікаво, а як щодо Java?
Слава

14

можливо, ви хочете поглянути на java.util.Stackклас. він має push, pop методи. та реалізований інтерфейс List.

для shift / unshift ви можете посилатися на відповідь @ Jon.

однак, щось із ArrayList, про яке ви можете піклуватися, arrayList не синхронізується. але Стек є. (підклас Вектор). Якщо у вас є вимоги до безпечної роботи з потоками, Stack може бути кращим за ArrayList.



Моя погана, я щойно зрозумів, що у недосипаному стані я не читав останньої половини.
MJ Rayburn,

3

Чудова відповідь Джона .

Хоча я лінивий і ненавиджу друкувати, тому створив простий приклад для вирізання та вставки для всіх інших людей, подібних до мене. Насолоджуйтесь!

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]

    }

}

2

Бібліотека Underscore-java містить методи push (значень), pop (), shift () та unshift (значень).

Приклад коду:

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"]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.