Cuplikan kuliah dengan seorang mentor sebagai bagian dari kursus Codegym University. Mendaftar untuk kursus penuh.


"Salam, Amigo!"

"Halo, Rishi!"

"Anda sudah tahu satu atau dua hal tentang array, dan saya harap Anda bahkan berhasil menyelesaikan beberapa tugas. Tapi Anda tidak tahu segalanya. Misalnya, inilah fakta menarik lainnya tentang array. Array tidak hanya satu dimensi (linear ). Mereka juga bisa dua dimensi."

"Um ... Apa artinya itu?"

"Ini berarti bahwa sel-sel dari array tidak hanya dapat mewakili kolom (atau baris), tetapi juga tabel persegi panjang.

int[][]name = new int[width][height];

"Di mana name adalah nama variabel array, width adalah lebar tabel (dalam sel), dan height adalah tinggi tabel. Lihat contoh berikut:

int[][] data = new int[2][5];
data[1][1] = 5;
Kami membuat array dua dimensi: 2 kolom dan 5 baris.
Kami menulis 5 di sel (1,1).

"Beginilah tampilannya di memori:

Array dua dimensi

"Ngomong-ngomong, untuk array dua dimensi, Anda juga bisa menggunakan inisialisasi cepat:

// Lengths of months of the year in each quarter
int[][] months = { {31, 28, 31}, {30, 31, 30}, {31, 31, 30}, {31, 30, 31} };

"Hmm... sekarang menarik. Jika kita membayangkan bahwa tanda kurung dalam pertama mewakili satu elemen, yang berikutnya adalah yang kedua... Jadi array dua dimensi itu seperti array dari array?"

"Sungguh murid yang cerdas! Tepat sekali. Elemen pertama adalah larik satu dimensi {31, 28, 31}, yang kedua adalah {30, 31, 30}, dan seterusnya. Tapi kita akan membahasnya nanti di pelajaran ini. Sampai saat itu, coba pikirkan array dua dimensi sebagai tabel dengan baris dan kolom, membentuk sel di setiap persimpangan.

"Saya punya gambaran mental tentang itu. Omong-omong, untuk apa mereka digunakan, susunan dua dimensi ini?"

"Pemrogram cukup sering membutuhkan larik dua dimensi. Jika Anda melihat lebih dekat, hampir semua permainan papan diimplementasikan menggunakan larik dua dimensi yang tersedia: catur, catur, tic-tac-toe, pertempuran laut, dll.:"

pertempuran laut

"Aku mengerti! Lapangan bermain catur atau pertempuran laut sangat cocok dengan susunan dua dimensi!"

"Ya, tetapi Anda perlu menggunakan angka sebagai koordinat sel. Bukan 'pion e2-e4', tetapi 'pion (5,2) -> (5,4)'. Akan lebih mudah bagi Anda sebagai seorang programmer. "

Menyusun elemen dalam array: (x, y) atau (y, x)

"Membuat array dua dimensi menimbulkan dilema yang menarik. Saat kita membuat array menggunakan new int [2][5];, apakah kita memiliki tabel 'dua baris dan 5 kolom ' atau 'dua kolom dan 5 baris'?"

"Dengan kata lain, tidak sepenuhnya jelas apakah kita pertama-tama menentukan lebar dan kemudian 'tinggi... atau sebaliknya, pertama tinggi dan kemudian lebar?"

"Ya, inilah dilemanya. Dan tidak ada jawaban yang pasti."

"Apa yang harus dilakukan?"

"Pertama, penting untuk memahami bagaimana susunan dua dimensi kita sebenarnya disimpan dalam memori . Secara alami, memori komputer sebenarnya tidak memiliki tabel apa pun di dalamnya: setiap lokasi dalam memori memiliki alamat numerik berurutan: 0, 1, 2, ... Bagi kami, ini adalah tabel 2 × 5, tetapi dalam memori hanya 10 sel, tidak lebih. Tidak ada pembagian menjadi baris dan kolom."

"Saya mengerti itu. Lalu bagaimana kita menentukan dimensi mana yang lebih dulu - lebar atau tinggi?"

"Mari pertimbangkan opsi pertama. Lebar dulu, baru tinggi. "Argumen yang mendukung pendekatan ini adalah ini: semua orang belajar matematika di sekolah, dan mereka belajar bahwa pasangan koordinat ditulis sebagai 'x' (yaitu, sumbu horizontal) dan kemudian 'y' (dimensi vertikal). Dan ini bukan hanya standar sekolah — ini adalah standar matematika yang diterima secara umum. Seperti yang mereka katakan, Anda tidak bisa berdebat dengan matematika."

"Begitukah? Nah, jika kita tidak bisa melawannya, pertama-tama lebarnya lalu tingginya?"

"Ada argumen menarik yang mendukung 'height first, then width' . Argumen ini berasal dari inisialisasi cepat array dua dimensi. Lagi pula, jika kita ingin menginisialisasi array kita, maka kita menulis kode seperti ini:"

// Matrix of important data
int[][] matrix = { {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5} };

"Jadi, apa manfaatnya bagi kita?"

"Apakah kamu memperhatikan sesuatu? Bagaimana jika kita memiliki ini?

// Matrix of important data
int[][] matrix = {
  {1, 2, 3, 4, 5},
  {1, 2, 3, 4, 5}
};

"Jika kita menulis data kita dalam kode baris demi baris, maka kita mendapatkan tabel dengan 2 baris dan 5 kolom."

"Sekarang aku mengerti. 2 adalah tingginya, dan 5 adalah lebarnya... Jadi opsi mana yang harus kita gunakan?"

"Terserah Anda untuk memutuskan mana yang lebih nyaman. Yang paling penting adalah semua programmer yang mengerjakan proyek yang sama tetap menggunakan pendekatan yang sama."

"Jika Anda mengerjakan proyek yang kodenya memiliki banyak larik dua dimensi yang diinisialisasi, kemungkinan besar semua yang ada di sana akan didasarkan pada inisialisasi data cepat, yaitu Anda akan memiliki standar 'tinggi x lebar'.

"Jika Anda menemukan diri Anda dalam proyek yang melibatkan banyak matematika dan bekerja dengan koordinat (misalnya, mesin game), maka kode tersebut kemungkinan besar akan mengadopsi pendekatan 'lebar x tinggi'.

Bagaimana array dua dimensi disusun

"Sekarang, apakah Anda ingat fitur khusus dari array dua dimensi yang Anda perhatikan di awal pelajaran?"

"Ya! Array dua dimensi sebenarnya adalah array dari array!"

"Benar sekali." -variabel array menyimpan referensi ke wadah yang menyimpan referensi ke array satu dimensi. Lebih baik melihatnya beraksi sekali daripada mencoba menjelaskannya ratusan kali:"

Bagaimana array dua dimensi disusun

"Di sebelah kiri , kita memiliki variabel larik dua dimensi, yang menyimpan referensi ke objek larik dua dimensi. Di tengah ada objek larik dua dimensi yang selnya menyimpan larik satu dimensi, yaitu baris dari array dua dimensi. Dan di sebelah kanan , Anda dapat melihat empat array satu dimensi — baris dari array dua dimensi kita. Beginilah sebenarnya cara kerja array dua dimensi."

"Fantastis! Tapi apa yang kita dapatkan?"

"Karena 'wadah wadah' menyimpan referensi ke 'array baris', kita dapat menukar baris dengan sangat cepat dan mudah. ​​Untuk mendapatkan 'wadah wadah', Anda hanya perlu menentukan satu indeks, bukan dua. Contoh:

int[][] data = new int[2][5];
int[] row1 = data[0];
int[] row2 = data[1];

"Lihat kode di bawah ini. Kita bisa menggunakannya untuk menukar baris:"

// Matrix of important data
int[][] matrix = {
  {1, 2, 3, 4, 5},
  {5, 4, 3, 2, 1}
};

int[] tmp = matrix[0];
matrix[0] = matrix[1];
matrix[1] = tmp;
Array dua dimensi





matrix[0]menyimpan referensi ke baris pertama.
Kami menukar referensi.

Akibatnya, matrixarray terlihat seperti ini:
{
  {5, 4, 3, 2, 1},
  {1, 2, 3, 4, 5}
};

"Mengerti. Ini berfungsi seperti menukar dua item biasa."

"Begitulah. Nah, jika Anda merujuk ke sel dari array dua dimensi, tetapi Anda hanya menentukan satu indeks setelah nama array, maka Anda merujuk ke wadah dari wadah yang selnya menyimpan referensi ke yang biasa- array dimensi."

"Semuanya tampak logis dan jelas. Terima kasih atas ceramahnya, Rishi!"

"Sama-sama. Laksanakan dengan bijak."