"Rishi, aku sangat menantikan untuk belajar tentang metode kelas Array lainnya.

"Semangat belajar seperti itu tidak bisa tidak menyenangkan guru lamamu! Tapi, jika kamu benar-benar ingin mengetahui segalanya, penyihir baik hati bernama Google akan membantumu siang dan malam."

"Eh..."

"Hanya bercanda. Agak. Tentu saja, saya akan menjelaskan semuanya dengan lebih baik, tetapi jika sesuatu muncul - ingat penyihir yang baik. Saya akan memulai pelajaran hari ini dengan Arrays.fillmetode

"Ketika bekerja dengan array, pemrogram Java sangat sering perlu mengisi array dengan nilai yang sama. Anda tentu saja dapat menulis sebuah loop dan hanya menetapkan beberapa nilai ke setiap sel array dalam loop:

int[] x = new int[100];
for (int i = 0; i < x.length; i++)
x[i] = 999;

"Atau alih-alih semua ini, Anda dapat memanggil Arrays.fill()metode, yang melakukan hal yang persis sama: mengisi larik yang diteruskan dengan nilai yang diteruskan. Begini tampilannya:

Arrays.fill(name, value)

Dan kode pada contoh di atas dapat dibuat sedikit lebih ringkas dan jelas:

int[] x = new int[100];
Arrays.fill(x, 999);

"Cantik!"

"Anda juga dapat menggunakan Arrays.fill()metode untuk mengisi bukan seluruh larik, tetapi sebagian darinya, dengan beberapa nilai:

Arrays.fill(name, first, last, value)

"Di mana pertama dan terakhir adalah indeks sel pertama dan terakhir yang harus diisi.

Sesuai dengan tradisi lama baik (atau buruk) Jawa, ingatlah bahwa elemen terakhir tidak termasuk dalam jangkauan.

Contoh:

int[] x = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

Arrays.fill(x, 3, 7, 999);


String str = Arrays.toString(x);

Kami mengisi sel x[3], x[4], x[5], dan x[6]dengan nilai 999. Sel-sel array diberi nomor mulai dari nol!

Variabel strberisi nilai
"[1, 2, 3, 999, 999, 999, 999, 8, 9, 10]"

" Arrays.fill()Metode ini hanya bekerja dengan larik satu dimensi. Jika Anda meneruskan larik dua dimensi ke metode, itu akan diperlakukan sebagai satu dimensi, dengan semua konsekuensi berikutnya.

Arrays.copyOf()

"Amigo, tolong beri tahu saya cara mengubah ukuran array setelah dibuat?"

"Umm... Itu pertanyaan jebakan, kan? Aku sudah tidak berpengalaman lagi. Jawaban yang benar adalah kamu tidak bisa! Kamu tidak bisa mengubah ukuran array setelah dibuat."

"Tapi bagaimana jika kamu benar-benar menginginkannya?"

"Itu masih tidak mungkin!

"Sebenarnya, jika kamu benar-benar menginginkannya, maka kamu bisa! Dengan bantuan trik pemrograman:

  1. Pertama, Anda membuat larik baru dengan panjang yang diinginkan
  2. Kemudian Anda menyalin semua elemen dari larik pertama ke dalamnya.

"Ini adalah dua hal yang Arrays.copyOf()dilakukan metode ini. Seperti inilah pemanggilannya:

Type[] name2 = Arrays.copyOf(name, length);

"Metode ini tidak mengubah larik yang ada , melainkan membuat larik baru dan menyalin elemen larik lama ke dalamnya."

"Bagaimana jika panjang array baru kurang dari panjang yang sudah ada ?

"Pertanyaan bagus, Amigo! Jika elemennya tidak cocok, maka nilai tambahannya akan diabaikan begitu saja."

"Dan jika, sebaliknya, ada sel ekstra, berapa nilai awalnya?

"Jika panjang array baru lebih besar dari panjang yang lama, sel diisi dengan nol.

Contoh:

int[] x = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

int[] x2 = Arrays.copyOf(x, 5);
String str2 = Arrays.toString(x2);

int[] x3 = Arrays.copyOf(x, 15);
String str3 = Arrays.toString(x3);


Variabel str2berisi nilai Variabel berisi nilai
"[1, 2, 3, 4, 5]"

str3
"[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0]"

Arrays.copyOfRange()

"Dan bagaimana jika Anda ingin mendapatkan larik dengan panjang 5 dari larik dengan panjang 10, tetapi Anda membutuhkannya untuk memuat 5 elemen terakhir daripada 5 elemen pertama? Dalam hal ini, Anda memerlukan metode kelas yang lain. Ini Arraysadalah Arrays.copyOfRange(). Seperti inilah pemanggilannya:

Type[] name2 = Arrays.copyOfRange(name, first, last);

"Metode ini juga membuat larik baru, tetapi mengisinya dengan elemen dari sembarang tempat di larik asli. Di mana pertama dan terakhir adalah indeks dari elemen pertama dan terakhir yang harus dimasukkan ke dalam larik baru. Bisakah Anda memberi tahu saya apakah elemen terakhir termasuk dalam rentang ini?"

"Ha! Seperti yang sering dikatakan oleh guru besar saya, ' sesuai dengan tradisi lama baik (atau buruk) Jawa, ingatlah bahwa elemen terakhir tidak termasuk dalam rentang '."

"Amigo, kamu tumbuh tepat di depan mata kami.

Contoh:

int[] x = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20};

int[] x2 = Arrays.copyOfRange(x, 5, 10);
String str2 = Arrays.toString(x2);

int[] x3 = Arrays.copyOfRange(x, 5, 15);
String str3 = Arrays.toString(x3);


Variabel str2berisi nilai Variabel berisi nilai
"[16, 17, 18, 19, 20]"

str3
"[16, 17, 18, 19, 20, 0, 0, 0, 0, 0]"

Arrays.sort()

"Dan akhirnya, saya meninggalkan metode yang paling... mmm... menyenangkan untuk yang terakhir: sorting . Array cukup sering diurutkan dalam pemrograman. Berikut adalah 3 tindakan paling populer saat bekerja dengan array:

  • Menyortir array
  • Menemukan elemen minimum (atau maksimum) dari sebuah array
  • Menentukan indeks elemen dalam array (menemukan elemen dalam array)

"Algoritme pengurutan yang berkinerja baik, harus saya katakan, tidak mudah untuk ditulis. Lebih tepatnya, ini adalah tugas standar, dan sebagai siswa, kadang-kadang tidak ada salahnya Anda berlatih menulis algoritme pengurutan. Tetapi di tempat kerja, itu lebih baik jangan buang waktu Anda untuk menemukan kembali roda. Pencipta Java menyertakan metode sort()di Arrayskelas. Seperti inilah tampilannya:

Arrays.sort(name);

Metode ini mengurutkan array yang diteruskan dalam urutan menaik.

Contoh:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};

Arrays.sort(x);
String str = Arrays.toString(x);


Variabel strberisi nilai
"[-20, -20, -20, -2, 0, 3, 8, 11, 99, 999]"

"Luar biasa! Saya memanggil hanya satu metode dan lariknya sudah diurutkan. Suatu hal yang indah!"

"Ngomong-ngomong, Anda tidak hanya dapat mengurutkan seluruh array, tetapi juga hanya sebagian saja. Seperti inilah tampilannya:

Arrays.sort(name, first, last);

"Di mana pertama dan terakhir adalah indeks dari sel pertama dan terakhir yang harus disentuh. DAN…

"Saya sudah tahu apa yang akan Anda katakan! 'Sesuai dengan tradisi lama Jawa yang baik (atau buruk), ingatlah bahwa elemen terakhir tidak termasuk dalam jangkauan' .

Contoh:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};

Arrays.sort(x, 4, 8);
String str = Arrays.toString(x);


Variabel strberisi nilai
"[11, -2, 3, 0, -20, -20, 8, 999, 99, -20]"

"Untuk mengurutkan array, Java menggunakan algoritme pengurutan tercepat — QuickSort . Kompleksitas komputasinya bergantung pada ukuran array dan dihitung menggunakan rumus N log(N).

"Menyortir array dari 1000 elemen akan melibatkan sekitar 10.000 perbandingan elemen array. Menyortir array dari satu juta elemen akan melibatkan sekitar 20 juta perbandingan."

" Tidak terlalu banyak perbandingan jika Anda mempertimbangkan jumlah elemennya!"

"Itulah yang saya katakan. Algoritme QuickSort sangat efisien.

Arrays.binarySearch()

"Nah, dan metode terakhir yang paling menarik dari Arrayskelas ini adalah mampu mencari nilai yang diberikan dalam sebuah array. Ini bukan pencarian biasa — ini adalah pencarian biner tercinta . Intinya begini:

  • Pertama, array diurutkan.
  • Kemudian elemen tengah dari array dibandingkan dengan yang kita cari.
  • Jika elemen lebih besar dari elemen tengah, maka pencarian dilanjutkan di bagian kanan array.
  • Jika elemen yang kita cari kurang dari elemen tengah, maka pencarian dilanjutkan di bagian kiri array.

"Karena array diurutkan, adalah mungkin untuk menghilangkan setengahnya dalam satu perbandingan. Kemudian pada langkah selanjutnya, kita membuang setengahnya lagi, dan seterusnya."

"Fantastis! Kita bergerak langsung ke gawang dengan sangat cepat!"

"Tepat. Dalam larik satu juta (!) elemen, algoritme pencarian biner dapat menemukan indeks elemen yang diinginkan hanya dalam 20 perbandingan. Kekurangan algoritme adalah bahwa larik harus diurutkan terlebih dahulu, dan penyortiran juga membutuhkan waktu.

Seperti inilah tampilannya:

int index = Arrays.binarySearch(name, value);

“Mana namenama array yang harus dilalui sudah diurutkan (misalnya menggunakan metode Arrays.sort()). Dan valueapakah elemen yang kita cari ada di dalam array. Hasil yang dikembalikan oleh metode adalah indeks elemen array yang diinginkan .

Contoh:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};
Arrays.sort(x);

int index1 = Arrays.binarySearch(x, 0);
int index2 = Arrays.binarySearch(x, -20);
int index3 = Arrays.binarySearch(x, 99);
int index4 = Arrays.binarySearch(x, 5);
xadalah
{-20, -20, -20, -2, 0, 3, 8, 11, 99, 999}

4
1(indeks 0dan 2juga dapat diterima)
8
-7

"Bagaimana jika elemen yang diinginkan muncul berkali-kali dalam array ?"

"Itu pertanyaan yang valid, Amigo. Dalam hal ini, algoritme akan mengembalikan indeks salah satunya (tidak ada jaminan bahwa itu akan menjadi, katakanlah, yang pertama, atau sebaliknya — yang terakhir dari elemen duplikat ini) ."

"Bagaimana jika array tidak mengandung elemen yang diinginkan sama sekali?"

"Dalam hal ini, algoritme akan mengembalikan indeks negatif .

Dokumentasi

"Semuanya jelas, Rishi! Ini sangat menarik."

"Jika Anda benar-benar menemukan ini sangat menarik, maka di waktu senggang Anda, telusuri dokumentasi resmi kelas Arraysdan metodenya di situs web Oracle .

"Anda dapat melihat lebih dekat, misalnya, metode Arrays.mismatch()dan Arrays.compare(). Kemungkinan besar Anda akan dapat memanfaatkannya dengan baik.

"Dan jangan bingung dengan jumlah metode. Setiap metode memiliki 5-10 varian, yang hanya berbeda dalam jenis parameternya."