1. Array dua dimensi

Satu lagi fakta menarik tentang array. Array tidak hanya satu dimensi (linier). Mereka juga bisa dua dimensi.

Apa artinya itu, Anda bertanya?

Ini berarti bahwa sel-sel 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. Contoh:

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

Begini tampilannya di memori:

Array dua dimensi

Omong-omong, Anda juga bisa menggunakan inisialisasi cepat untuk array dua dimensi:

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

Ada begitu banyak tempat di mana Anda, sebagai seorang programmer, mungkin membutuhkan array dua dimensi. Array dua dimensi adalah dasar dari hampir semua permainan papan, misalnya catur, dam, tic-tac-toe, dan pertempuran laut:

Array dua dimensi2

Susunan dua dimensi sangat cocok untuk catur atau pertempuran laut. Kami hanya membutuhkan angka dari koordinat sel. Bukan 'pion e2-e4', tapi 'pion (5,2) -> (5,4)'. Ini akan lebih mudah bagi Anda sebagai seorang programmer.


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

Omong-omong, ada dilema yang menarik di sini:

Saat kita membuat larik menggunakan new int[2][5];, apakah kita memiliki tabel 'dua baris dan 5 kolom ' atau 'dua kolom dan 5 baris '?" Dengan kata lain, apakah pertama-tama kita menentukan lebar lalu tingginya... atau sebaliknya, pertama tinggi lalu lebar Nah, seperti yang sering kita katakan, semuanya tidak sesederhana itu.

Mari kita mulai dengan pertanyaan bagaimana array disimpan di memory .

Tentu saja, memori komputer sebenarnya tidak memiliki matriks di dalamnya: setiap lokasi di memori memiliki alamat numerik berurutan: 0, 1, 2, ... Dalam kasus kami, kami berbicara tentang matriks 2 × 5, tetapi di memori itu hanya 10 sel berturut-turut, tidak lebih. Tidak ada yang menunjukkan di mana baris dan kolom berada.

Argumen yang mendukung "lebar x tinggi".

Argumen yang mendukung pendekatan ini adalah bahwa setiap orang belajar matematika di sekolah, di mana 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. Apakah begitu? Lebar pertama lalu tinggi?

Argumen yang mendukung "tinggi x lebar".

Ada juga argumen menarik yang dibuat untuk posisi ini: inisialisasi cepat array dua dimensi. Memang, jika kita ingin menginisialisasi array kita, maka kita dapat menulis kode seperti ini:

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

Apakah Anda tidak melihat apa-apa? 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 matriks dengan 2 baris dan 5 kolom.

Intinya

Apa yang bisa kita katakan? Terserah Anda untuk memutuskan mana yang lebih nyaman bagi Anda. Hal yang paling penting adalah bahwa semua pemrogram yang mengerjakan proyek yang sama berpegang pada pendekatan yang sama.

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

Jika Anda cukup beruntung 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'.


3. Bagaimana array dua dimensi disusun

Dan sekarang Anda akan belajar bagaimana array dua dimensi sebenarnya disusun. Siap?

Array dua dimensi sebenarnya adalah array dari array!

Dengan kata lain, jika dalam kasus array biasa variabel array menyimpan referensi ke wadah yang menyimpan elemen array, maka dalam kasus array dua dimensi situasinya sedikit meledak: variabel array dua dimensi 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. Dalamtengah kita memiliki objek array dua dimensi yang selnya menyimpan array satu dimensi, yang merupakan baris dari array dua dimensi. Dan di sebelah kanan , Anda dapat melihat empat larik satu dimensi — deretan larik dua dimensi kita.

Beginilah sebenarnya cara kerja array dua dimensi. Dan pendekatan ini memberi programmer Java beberapa keuntungan:

Pertama , karena 'container of containers' menyimpan referensi ke 'array of rows', kita dapat menukar baris dengan sangat cepat dan mudah. Untuk mendapatkan 'container of containers', Anda hanya perlu menentukan satu indeks, bukan dua. Contoh:

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

Kode ini memungkinkan Anda 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}
};

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