java howto ArrayList push, pop, shift และ unshift


89

ฉันพิจารณาแล้วว่า Java ArrayList.addนั้นคล้ายกับ JavaScriptArray.push

ฉันติดขัดในการค้นหาArrayListฟังก์ชันที่คล้ายกับสิ่งต่อไปนี้

  • Array.pop
  • Array.shift
  • Array.unshift ฉันเอนเอียงไป ArrayList.remove[At]

คำตอบ:


145

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 ในแง่ของเวลาทำงานจริง
Patrick

ในขณะที่ (Item item = items.remove (0)) {... } ไม่เทียบเท่ากะ
e-info128

เกี่ยวกับอะไร.push?
jameshfisher

1
OP กล่าวว่าเขารู้Array.push -> ArrayList.addและโดยเฉพาะถามเกี่ยวกับpop, และshift unshiftอ่านอีกครั้งฉันจะอธิบายเพิ่มเติมและเพิ่ม.pushไปพร้อม ๆ กัน
Jon Egeland

แม้ว่าจะไม่ได้ถาม แต่คำตอบนี้ก็ยังไม่สมบูรณ์หากไม่มีการกล่าวถึงความซับซ้อนของฟังก์ชันเหล่านี้
Jasper

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

@Slava O (n) กับ O (1) สำหรับเม็ดมีดด้านหน้าซึ่งมีขนาดใหญ่มาก
Ciro Santilli 郝海东冠状病六四事件法轮功

3
@CiroSantilli 新疆改造中心六四事件法轮功 O (n) และ O (1) เป็นเพียงความซับซ้อน ฉันได้ยินมาว่ารายการที่เชื่อมโยงนั้นค่อนข้างช้ากว่ารายการอาร์เรย์แม้กระทั่งสำหรับการแทรก / ลบ stackoverflow.com/questions/34170566/…ผมเลยสงสัยว่าแล้ว Java ล่ะ?
Slava

15

บางทีคุณอาจต้องการดูjava.util.Stackชั้นเรียน มันมีวิธีผลักดันป๊อป และใช้งานอินเทอร์เฟซรายการ

สำหรับ 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 (values)

ตัวอย่างโค้ด:

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"]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.