Apa cara terbaik untuk menghapus elemen pertama dari array?

87

Saya memiliki string array ( String[]) dan saya harus menghapus item pertama. Bagaimana saya bisa melakukannya secara efisien?

NullVoxPopuli
sumber
4
Bukan penipu. Pertanyaan sebelumnya adalah tentang menghapus item berdasarkan nilai; ini tentang menghapus item dengan indeks.
james.garriss

Jawaban:

158

Ukuran array di Java tidak bisa diubah. Jadi, secara teknis Anda tidak bisa menghapus elemen apa pun dari array.

Salah satu cara untuk mensimulasikan penghapusan elemen dari larik adalah dengan membuat larik baru yang lebih kecil, lalu menyalin semua elemen dari larik asli ke larik baru yang lebih kecil.

String[] yourArray = Arrays.copyOfRange(oldArr, 1, oldArr.length);

Namun , saya tidak menyarankan metode di atas. Anda harus benar-benar menggunakan file List<String>. Daftar memungkinkan Anda menambahkan dan menghapus item dari indeks mana pun. Itu akan terlihat seperti berikut ini:

List<String> list = new ArrayList<String>(); // or LinkedList<String>();
list.add("Stuff");
// add lots of stuff
list.remove(0); // removes the first item
jjnguy
sumber
34
Penting untuk dicatat bahwa menghilangkan elemen pertama dari an ArrayListadalah O (n).
Matthew Flaschen
1
@Matt, untuk larik dan daftar. Tapi, kodenya jauh lebih mudah untuk daftar.
jjnguy
16
Untuk array dan ArrayList, tetapi tidak untuk LinkedList.
Matthew Flaschen
4
Di) ? baik .. dalam array C? untuk menghapus elemen kepalan Anda cukup menaikkan penunjuk O (1)
Hernán Eche
3
Bagi mereka yang menggunakan Java untuk Android seperti saya, Arrays.copyOfRange()adalah untuk API9 +
Sdghasemi
15

Cara paling sederhana mungkin adalah sebagai berikut - Anda pada dasarnya perlu membuat array baru yang satu elemen lebih kecil, lalu salin elemen yang ingin Anda pertahankan ke posisi yang benar.

int n=oldArray.length-1;
String[] newArray=new String[n];
System.arraycopy(oldArray,1,newArray,0,n);

Perhatikan bahwa jika Anda sering melakukan operasi semacam ini, itu bisa menjadi tanda bahwa Anda seharusnya menggunakan jenis struktur data yang berbeda, misalnya daftar tertaut. Membuat larik baru setiap saat adalah operasi O (n), yang bisa menjadi mahal jika larik Anda besar. Daftar tertaut akan memberi Anda O (1) penghapusan elemen pertama.

Ide alternatif adalah tidak menghapus item pertama sama sekali, tetapi hanya menambah bilangan bulat yang mengarah ke indeks pertama yang digunakan. Pengguna larik perlu memperhitungkan offset ini, tetapi ini bisa menjadi pendekatan yang efisien. Kelas Java String sebenarnya menggunakan metode ini secara internal saat membuat substring.

mikera
sumber
4
Secara teknis ini bukanlah cara termudah. Arrays.copyOfRange()adalah.
jjnguy
4
Karena dia menggunakan Java6, dia dapat menggunakan Arrays.copyOfRange
Thilo
1
@Justin - pasti tetapi hanya jika Anda menargetkan Java 1.6 atau lebih tinggi
mikera
1
benar. Itu tidak selalu berlaku.
jjnguy
6
judul pertanyaan membuatnya jelas bahwa OP yang tertarik pada jawaban untuk Java 1.6 dan di atas.
Stephen C
5

Anda tidak bisa melakukannya sama sekali, apalagi dengan cepat. Array di Jawa berukuran tetap. Dua hal yang dapat Anda lakukan adalah:

  1. Geser setiap elemen ke atas satu, lalu setel elemen terakhir ke nol.
  2. Buat array baru, lalu salin.

Anda dapat menggunakan System.arraycopysalah satu dari ini. Keduanya adalah O (n), karena mereka menyalin semua kecuali 1 elemen.

Jika Anda akan sering membuang elemen pertama, pertimbangkan untuk menggunakannya LinkedList. Anda dapat menggunakan LinkedList.remove, yang dari Queueantarmuka, untuk kenyamanan. Dengan LinkedList, menghapus elemen pertama adalah O (1). Faktanya, menghapus elemen apapun adalah O (1) setelah Anda memiliki ListIteratorposisi tersebut. Namun, mengakses elemen arbitrer dengan indeks adalah O (n).

Matthew Flaschen
sumber
3

Simpan indeks elemen "langsung" pertama dari array. Menghapus (berpura-pura menghapus) elemen pertama kemudian menjadi O(1)operasi kompleksitas waktu.

msw
sumber
0

Singkatnya, metode quick linkedlist:

List<String> llist = new LinkedList<String>(Arrays.asList(oldArray));
llist.remove(0);
mjad-org
sumber
-10

Metode jelek alternatif:

   String[] a ={"BLAH00001","DIK-11","DIK-2","MAN5"};
   String[] k=Arrays.toString(a).split(", ",2)[1].split("]")[0].split(", ");
Emil
sumber
2
Tolong, seseorang dengan reputasi yang cukup meremehkan jawaban ini - persis seperti yang dikatakannya - jelek! Tidak ada niat untuk bersikap kasar, tetapi demi kepentingan kodeabilitas, harap jangan memposting hal semacam ini!
Hack5
jika Anda sudah menggunakan Array, akan lebih baik menggunakan Arrays.copyOfRange
Bishal Gautam
Dia meminta cara terbaik .
Sapphire_Brick
hapus, dan lihat seberapa besar reputasi yang akan Anda peroleh.
Sapphire_Brick