java howto ArrayList push, pop, shift, dan unshift

89

Saya telah menentukan bahwa Java ArrayList.addmirip dengan JavaScriptArray.push

Saya terjebak dalam menemukan ArrayListfungsi yang mirip dengan berikut ini

  • Array.pop
  • Array.shift
  • Array.unshift Saya condong ke arah ArrayList.remove[At]
Jacksonkr
sumber

Jawaban:

145

ArrayListunik dalam standar penamaannya. Berikut persamaannya:

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

Perhatikan bahwa unshifttidak menghapus elemen, tetapi menambahkan satu ke daftar. Perhatikan juga bahwa perilaku kasus sudut mungkin berbeda antara Java dan JS, karena masing-masing memiliki standarnya sendiri.

Jon Egeland
sumber
9
Jika Anda melakukan banyak "unshifting" tetapi tidak banyak mendapatkan indeks tengah, Anda mungkin menemukan ArrayList lebih rendah daripada LinkedList dalam hal waktu berjalan yang sebenarnya.
Patrick
sementara (Item item = items.remove (0)) {...} tidak setara dengan shift.
e-info128
Tentang apa .push?
jameshfisher
1
OP mengatakan ia tahu Array.push -> ArrayList.add, dan secara khusus bertanya tentang pop, shiftdan unshift. Membaca ini lagi, saya akan menambahkan lebih banyak penjelasan dan menambahkan .pushpada saat yang bersamaan.
Jon Egeland
Meski tidak ditanyakan, namun jawaban ini terasa belum lengkap tanpa menyebutkan kompleksitas fungsi-fungsi tersebut.
Jasper
25

Saya menghadapi masalah ini beberapa waktu lalu dan saya menemukan java.util.LinkedListyang terbaik untuk kasus saya. Ini memiliki beberapa metode, dengan penamaan berbeda, tetapi mereka melakukan apa yang dibutuhkan:

push()    -> LinkedList.addLast(); // Or just LinkedList.add();
pop()     -> LinkedList.pollLast();
shift()   -> LinkedList.pollFirst();
unshift() -> LinkedList.addFirst();
Wirone
sumber
1
Mengapa ini tidak diterima ?! Catatan: LinkeListmenambahkan metode yang akan sangat tidak efisien pada ArrayList ke Listantarmuka, ini adalah apa yang saya bingung. Metode ini berasal dari antarmuka Dequedan Queueyang diimplementasikannya, tetapi ArrayListtidak.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
@CiroSantilli 新疆 改造 中心 六四 事件 法轮功 tapi seberapa tidak efisien?
Slava
@Slava O (n) vs O (1) untuk sisipan depan, yang sangat besar.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
3
@CiroSantilli 新疆 改造 中心 六四 事件 法轮功 O (n) dan O (1) hanyalah kompleksitas. Saya mendengar bahwa daftar tertaut bisa sangat lambat daripada daftar array bahkan untuk penyisipan / penghapusan. stackoverflow.com/questions/34170566/… Jadi saya bertanya-tanya, bagaimana dengan Java?
Slava
15

mungkin Anda ingin melihat-lihat java.util.Stackkelas. itu memiliki metode push, pop. dan menerapkan antarmuka Daftar.

Untuk shift / unshift, Anda bisa mereferensikan jawaban @ Jon.

namun, sesuatu dari ArrayList yang mungkin ingin Anda pedulikan, arrayList tidak disinkronkan. tapi Stack adalah. (sub-kelas Vektor). Jika Anda memiliki persyaratan thread-safe, Stack mungkin lebih baik daripada ArrayList.

Kent
sumber
Sayangnya, saya baru menyadari bahwa dalam kondisi kurang tidur saya tidak membaca setengah bagian terakhir.
MJ Rayburn
3

Jawaban Hebat oleh Jon .

Saya malas dan saya benci mengetik, jadi saya membuat contoh potong dan tempel sederhana untuk semua orang yang seperti saya. Nikmati!

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

Library Underscore-java berisi metode push (values), pop (), shift (), dan unshift (values).

Contoh kode:

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
sumber