java howto ArrayList push, pop, shift và unshift


88

Tôi đã xác định rằng Java ArrayList.addtương tự như JavaScriptArray.push

Tôi gặp khó khăn khi tìm các ArrayListchức năng tương tự như sau

  • Array.pop
  • Array.shift
  • Array.unshift Tôi đang nghiêng về phía ArrayList.remove[At]

Câu trả lời:


142

ArrayListlà duy nhất trong các tiêu chuẩn đặt tên của nó. Dưới đây là các điểm tương đương:

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

Lưu ý rằng unshiftkhông loại bỏ một phần tử, nhưng thay vào đó thêm một phần tử vào danh sách. Cũng xin lưu ý rằng các hành vi dạng chữ hoa góc có thể khác nhau giữa Java và JS, vì chúng có tiêu chuẩn riêng.


9
Nếu bạn đang thực hiện nhiều "không chuyển đổi" nhưng không đạt được nhiều ở các chỉ số trung bình, bạn có thể thấy ArrayList kém hơn so với LinkedList về thời gian chạy thực tế.
Patrick

while (Item item = items.remove (0)) {...} không tương đương với shift.
e-info128

Về .pushthì sao?
jameshfisher

1
OP nói anh biết Array.push -> ArrayList.add, và yêu cầu cụ thể về pop, shiftunshift. Đọc lại điều này, tôi sẽ bổ sung thêm lời giải thích và bổ sung .pushcùng một lúc.
Jon Egeland

Mặc dù nó không được hỏi, câu trả lời này cảm thấy không đầy đủ nếu không đề cập đến sự phức tạp của các chức năng này.
Jasper

25

Tôi đã đối mặt với vấn đề này một thời gian trước đây và tôi thấy java.util.LinkedListlà tốt nhất cho trường hợp của tôi. Nó có một số phương thức, với các tên khác nhau, nhưng chúng đang làm những gì cần thiết:

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

1
Tại sao điều này không được chấp nhận ?! Lưu ý: LinkeListbổ sung thêm các phương pháp đó sẽ là rất không hiệu quả trên ArrayList đến Listgiao diện, đây là những gì nhầm lẫn tôi. Các phương thức này đến từ giao diện DequeQueuemà nó thực hiện, nhưng ArrayListkhông.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

1
@CiroSantilli 新疆 改造 中心 六四 事件 法轮功 nhưng kém hiệu quả đến mức nào?
Slava

@Slava O (n) so với O (1) cho chèn phía trước, rất lớn.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

3
@CiroSantilli 新疆 改造 中心 六四 事件 法轮功 O (n) và O (1) chỉ là sự phức tạp. Tôi nghe nói rằng danh sách được liên kết có thể khá chậm hơn so với danh sách mảng ngay cả đối với việc chèn / xóa. stackoverflow.com/questions/34170566/… Vì vậy, tôi tự hỏi, còn Java thì sao?
Slava

14

có thể bạn muốn tham gia một java.util.Stacklớp học. nó có các phương thức push, pop. và giao diện Danh sách được triển khai.

đối với shift / unshift, bạn có thể tham khảo câu trả lời của @ Jon.

tuy nhiên, một số thứ về ArrayList mà bạn có thể muốn quan tâm, arrayList không được đồng bộ hóa. nhưng Stack là. (hạng con của Vector). Nếu bạn có yêu cầu an toàn luồng, Stack có thể tốt hơn ArrayList.



Thật tệ, tôi chỉ nhận ra rằng trong trạng thái thiếu ngủ của mình, tôi đã không đọc nửa cuối.
MJ Rayburn

3

Câu trả lời tuyệt vời của Jon .

Mặc dù vậy, tôi lười và tôi ghét đánh máy, vì vậy tôi đã tạo một ví dụ cắt và dán đơn giản cho tất cả những người khác giống tôi. Thưởng thức!

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

Thư viện underscore-java chứa các phương thức push (giá trị), pop (), shift () và unshift (giá trị).

Ví dụ về mã:

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"]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.