Panjang Variabel (Dinamis) Array di Jawa


108

Saya bertanya-tanya bagaimana cara menginisialisasi array integer sedemikian rupa sehingga ukuran dan nilainya berubah selama pelaksanaan program saya, ada saran?

Jawaban:


121

Ya: gunakan ArrayList .

Di Java, array "normal" berukuran tetap. Anda harus memberi mereka ukuran dan tidak dapat mengembangkan atau mengontraknya. Untuk mengubah ukuran, Anda harus membuat array baru dan menyalin data yang Anda inginkan - yang tidak efisien dan merepotkan Anda.

Untungnya, ada semua jenis kelas bawaan yang mengimplementasikan struktur data umum, dan juga alat berguna lainnya. Anda akan ingin memeriksa Java 6 API untuk daftar lengkapnya.

Satu peringatan: ArrayList hanya dapat menampung objek (misalnya Integer), bukan primitif (misalnya ints). Dalam KEBANYAKAN kasus, autoboxing / autounboxing akan menangani ini untuk Anda secara diam-diam, tetapi Anda bisa mendapatkan beberapa perilaku aneh tergantung pada apa yang Anda lakukan.


2
Saya bertanya-tanya mengapa kode berikut tepat di java? int[] array = new int[size]; sizeadalah variabel, tetapi panjang array harus tetap, apakah saya benar? @Lord Torgamus
jerry_sjtu

12
@jerry_sjtu ya, larik tidak berubah ukuran untuk mencocokkan sizesaat program berjalan; itu mendapat ukuran apa pun yang terjadi sizeketika baris itu dijalankan.
Muncul

Setiap kali saya menghapus item dari ArrayList, saya berakhir dengan a nulldi bagian akhir. Ada ide mengapa?
Aaron Franke

37

Array di Jawa memiliki ukuran tetap. Yang Anda perlukan adalah ArrayList, salah satu dari Koleksi yang sangat berharga yang tersedia di Java.

Dari pada

Integer[] ints = new Integer[x]

Kau gunakan

List<Integer> ints = new ArrayList<Integer>();

Kemudian untuk mengubah daftar yang Anda gunakan ints.add(y)dan di ints.remove(z)antara banyak metode praktis lainnya yang dapat Anda temukan di Javadocs yang sesuai.

Saya sangat menyarankan mempelajari kelas Koleksi yang tersedia di Java karena sangat kuat dan memberi Anda banyak fungsionalitas bawaan yang cenderung coba ditulis ulang oleh pemula Java jika tidak perlu.


ingin bekerja sampai saya mencoba: List <Integer> ints = new ArrayList <Integer> ();
gorbysbm

5
Mengapa Anda menggunakan, List<Integer>bukan ArrayList<Integer>?
Dean Meehan

24

Array adalah ukuran tetap setelah dipakai. Anda dapat menggunakan Daftar sebagai gantinya.

Autoboxing membuat List dapat digunakan mirip dengan array, Anda dapat memasukkan int-values ​​ke dalamnya:

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);

2
Mengapa Anda mendeklarasikan variabel referensi bertipe List, dan bukan ArrayList?
LppEdd

2
Karena ini memungkinkan Anda untuk beralih di antara implementasi-List jika diperlukan, Anda hanya perlu mengubah XYZList () baru. Jika variabel dideklarasikan sebagai ArrayList, oyu mungkin menggunakan metode khusus untuk implementasi ini, membuat perubahan menjadi lebih rumit.
Mnementh

1
Terima kasih, saya mengerti.
LppEdd

11

Saya tidak setuju dengan jawaban sebelumnya menyarankan ArrayList, karena ArrayListini bukan Array Dinamis tapi Daftar didukung oleh sebuah array. Perbedaannya adalah Anda tidak dapat melakukan hal berikut:

ArrayList list = new ArrayList(4);
list.put(3,"Test");

Ini akan memberi Anda IndexOutOfBoundsException karena belum ada elemen pada posisi ini meskipun larik pendukung akan mengizinkan penambahan seperti itu. Jadi, Anda perlu menggunakan implementasi Array kustom yang dapat diperpanjang seperti yang disarankan oleh @ randy-lance



Saya tidak yakin apakah ArrayList memiliki metode put seperti yang saya lihat di kode sumber Java8. Hanya mencoba mencari tahu bagaimana berperilaku dengan kapasitas yang diberikan. Namun ditemukan metode ArrayList.add ().
Sanjeet A

11
Simple code for dynamic array. In below code then array will become full of size we copy all element to new double size array(variable size array).sample code is below 

public class DynamicArray {
 static   int []increaseSizeOfArray(int []arr){
          int []brr=new int[(arr.length*2)];
          for (int i = 0; i < arr.length; i++) {
         brr[i]=arr[i];     
          }
          return brr;
     }
public static void main(String[] args) {
     int []arr=new int[5];
      for (int i = 0; i < 11; i++) {
          if (i<arr.length) {
              arr[i]=i+100;
          }
          else {
              arr=increaseSizeOfArray(arr);
              arr[i]=i+100;
          }        
     }

for (int i = 0; i < arr.length; i++) {
     System.out.println("arr="+arr[i]);
}    
}

}

Sumber: Cara membuat dynamic array


7
  1. Disarankan untuk menggunakan List untuk menangani ukuran skala kecil.

  2. Jika Anda memiliki banyak nomor, JANGAN PERNAH gunakan List dan autoboxing,

    Daftar <Integer> list

Untuk setiap int, Integer baru dibuat secara otomatis. Anda akan merasa semakin lambat ketika ukuran daftar bertambah. Integer ini adalah objek yang tidak perlu. Dalam hal ini, menggunakan ukuran perkiraan akan lebih baik,

int[] array = new int[ESTIMATED_SIZE];

4

Bagaimana kalau menggunakan a Listsebagai gantinya? Sebagai contoh,ArrayList<integer>


4

Anda tidak dapat mengubah ukuran array. Namun, Anda dapat membuat larik baru dengan ukuran yang tepat dan menyalin data dari larik lama ke larik baru.

Tetapi pilihan terbaik Anda adalah menggunakan IntList dari jacarta commons. ( disini )

Ia bekerja seperti List tetapi membutuhkan lebih sedikit ruang dan lebih efisien daripada itu, karena ia menyimpan int daripada menyimpan objek wrapper di atas int (itulah kelas Integer).


-4

Saya menjawab pertanyaan ini dan tidak, Anda tidak memerlukan daftar larik atau hal lain, ini adalah tugas dan saya menyelesaikannya sehingga ya, larik dapat bertambah ukurannya. Berikut adalah tautan Cara menggunakan Java Dynamic Array dan ini adalah tautan untuk pertanyaan saya yang saya jawab Java Dynamic Array


1
ini salah. jawaban terkait memanggil System.arrayCopy (), menyalin larik lama ke larik baru dengan ukuran yang diperbesar, lalu menambahkan entri baru. array masih tidak bisa memiliki ukuran dinamis.
katzenhut
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.