java howto ArrayList push, pop, shift и unshift

88

Я определил, что Java ArrayList.addпохож на JavaScript.Array.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 с точки зрения фактического времени выполнения.
Патрик
while (Item item = items.remove (0)) {...} не эквивалентно shift.
e-info128,
О чем .push?
jameshfisher 05
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();
Wirone
источник
1
Почему это не принято ?! Примечание: LinkeListдобавляет ArrayList в Listинтерфейс методы, которые были бы очень неэффективными , вот что меня смутило. Эти методы приходят от Dequeи Queueинтерфейсов , которые он реализует, но ArrayListне.
Чиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
1
@CiroSantilli 新疆 改造 中心 六四 事件 法轮功 но насколько неэффективно?
Слава
@Slava O (n) vs O (1) для передней вставки, что огромно.
Чиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
3
@CiroSantilli 新疆 改造 中心 六四 事件 法轮功 O (n) и O (1) - это просто сложности. Я слышал, что связанные списки могут быть намного медленнее, чем списки массивов, даже при вставке / удалении. stackoverflow.com/questions/34170566/… Интересно, а как насчет Java?
Слава
14

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

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

однако что-то из ArrayList, о котором вы можете захотеть позаботиться, arrayList не синхронизируется. но стек есть. (подкласс Vector). Если у вас есть требования к потокобезопасности, 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"]
Валентин Колесников
источник