Coretan kuliah dengan mentor sebagai sebahagian daripada kursus Universiti Codegym. Daftar untuk kursus penuh.


"Salam, Amigo!"

"Hello, Rishi!"

"Anda sudah tahu satu atau dua perkara tentang tatasusunan, dan anda juga berjaya menyelesaikan beberapa tugasan, saya harap. Tetapi anda tidak tahu segala-galanya. Sebagai contoh, berikut adalah satu lagi fakta menarik tentang tatasusunan. Tatasusunan bukan sahaja satu dimensi (linear ). Ia juga boleh menjadi dua dimensi."

"Em... Apa maksudnya?"

"Ini bermakna bahawa sel tatasusunan boleh mewakili bukan sahaja lajur (atau baris), tetapi juga jadual segi empat tepat.

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

"Di mana nama ialah nama pembolehubah tatasusunan, lebar ialah lebar jadual (dalam sel) dan ketinggian ialah ketinggian jadual. Lihat contoh:

int[][] data = new int[2][5];
data[1][1] = 5;
Kami mencipta tatasusunan dua dimensi: 2 lajur dan 5 baris.
Kami menulis 5 dalam sel (1,1).

"Ini adalah bagaimana ia akan kelihatan dalam ingatan:

Tatasusunan dua dimensi

"Dengan cara ini, untuk tatasusunan dua dimensi, anda juga boleh menggunakan pemulaan pantas:

// 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 itu menarik. Jika kita bayangkan bahawa dalam kurungan dalam yang pertama mewakili satu elemen, yang seterusnya adalah yang kedua... Jadi tatasusunan dua dimensi adalah seperti tatasusunan?"

"Betapa pelajar pintar anda! Betul sekali. Elemen pertama ialah tatasusunan satu dimensi {31, 28, 31}, yang kedua ialah {30, 31, 30}, dan seterusnya. Tetapi kita akan kembali kepada itu sedikit kemudian dalam pelajaran ini. Sehingga itu, cuba fikirkan tatasusunan dua dimensi sebagai jadual dengan baris dan lajur, membentuk sel di setiap persimpangan.

"Saya mempunyai gambaran mental tentang itu. Ngomong-ngomong, untuk apa ia digunakan, tatasusunan dua dimensi ini?"

"Pengaturcara memerlukan tatasusunan dua dimensi dengan kerap. Jika anda melihat dengan teliti, hampir mana-mana permainan papan dilaksanakan menggunakan tatasusunan dua dimensi di luar rak: catur, dam, tic-tac-toe, pertempuran laut, dsb.:"

pertempuran laut

"Saya faham! Medan permainan catur atau pertempuran laut sesuai dengan susunan dua dimensi!"

"Ya, tetapi anda perlu menggunakan nombor sebagai koordinat sel. Bukan 'pawn e2-e4', tetapi 'pawn (5,2) -> (5,4)'. Ia akan menjadi lebih mudah untuk anda sebagai pengaturcara. "

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

"Mencipta tatasusunan dua dimensi menimbulkan dilema yang menarik. Apabila kita mencipta tatasusunan menggunakan new int [2][5];, adakah kita mempunyai jadual 'dua baris dan 5 lajur ' atau adakah ia 'dua lajur dan 5 baris'?"

"Dengan kata lain, ia tidak sepenuhnya jelas sama ada kita mula-mula menentukan lebar dan kemudian 'tinggi... atau sebaliknya, mula-mula tinggi dan kemudian lebar?"

"Ya, inilah dilemanya. Dan tiada jawapan yang pasti."

"Apa nak buat?"

"Pertama, adalah penting untuk memahami bagaimana tatasusunan dua dimensi kami sebenarnya disimpan dalam ingatan . Sememangnya, memori komputer sebenarnya tidak mempunyai sebarang jadual di dalamnya: setiap lokasi dalam ingatan mempunyai alamat angka berurutan: 0, 1, 2, ... Bagi kami, ini adalah jadual 2 × 5, tetapi dalam ingatan ia hanya 10 sel, tidak lebih. Tiada pembahagian kepada baris dan lajur."

"Saya faham itu. Jadi bagaimana kita menentukan dimensi mana yang didahulukan — lebar atau tinggi?"

"Mari kita pertimbangkan pilihan pertama. Lebar dahulu, kemudian tinggi. "Hujah yang menyokong pendekatan ini ialah ini: semua orang belajar matematik di sekolah, dan mereka belajar bahawa pasangan koordinat ditulis sebagai 'x' (iaitu, paksi mendatar) dan kemudian 'y' (dimensi menegak). Dan ini bukan sekadar standard sekolah — ia adalah piawaian yang diterima umum dalam matematik. Seperti yang mereka katakan, anda tidak boleh berdebat dengan matematik."

"Begitukah? Nah, jika kita tidak dapat melawannya, maka lebar dahulu kemudian tinggi?"

"Terdapat hujah yang menarik yang memihak kepada 'tinggi dahulu, kemudian lebar' . Hujah ini datang daripada pemulaan pantas tatasusunan dua dimensi. Lagipun, jika kita ingin memulakan tatasusunan kita, maka kita menulis kod seperti ini:"

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

"Jadi apa gunanya untuk kita?"

"Awak perasan apa-apa? Kalau kita ada ni?

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

"Jika kami menulis data kami dalam kod baris demi baris, maka kami mendapat jadual dengan 2 baris dan 5 lajur."

"Sekarang saya nampak. 2 ialah ketinggian, dan 5 ialah lebar... Jadi pilihan mana yang patut kita gunakan?"

"Terpulang kepada anda untuk memutuskan mana yang lebih mudah. ​​Perkara yang paling penting ialah semua pengaturcara yang bekerja pada projek yang sama berpegang pada pendekatan yang sama."

"Jika anda mengusahakan projek yang kodnya mempunyai banyak tatasusunan dua dimensi yang dimulakan, maka kemungkinan besar segala-galanya akan berdasarkan pada permulaan data yang pantas, iaitu anda akan mempunyai 'tinggi x lebar' standard.

"Jika anda mendapati diri anda dalam projek yang melibatkan banyak matematik dan bekerja dengan koordinat (contohnya, enjin permainan), maka kod itu kemungkinan besar akan menggunakan pendekatan 'lebar x tinggi'.

Bagaimana tatasusunan dua dimensi disusun

"Sekarang, adakah anda masih ingat ciri khas tatasusunan dua dimensi yang anda perhatikan pada permulaan pelajaran?"

"Ya! Ia adalah tatasusunan dua dimensi sebenarnya ialah tatasusunan tatasusunan!"

"Betul. "Dalam erti kata lain, jika dalam kes tatasusunan biasa pembolehubah tatasusunan menyimpan rujukan kepada bekas yang menyimpan elemen tatasusunan, maka dalam kes tatasusunan dua dimensi keadaan meletup sedikit: dua dimensi -array variable menyimpan rujukan kepada bekas yang menyimpan rujukan kepada tatasusunan satu dimensi. Lebih baik melihatnya dalam tindakan sekali daripada cuba menerangkannya seratus kali:"

Bagaimana tatasusunan dua dimensi disusun

"Di sebelah kiri , kita mempunyai pembolehubah susunan dua dimensi, yang menyimpan rujukan kepada objek tatasusunan dua dimensi. Di tengah terdapat objek tatasusunan dua dimensi yang selnya menyimpan tatasusunan satu dimensi, iaitu baris tatasusunan dua dimensi. Dan di sebelah kanan , anda boleh melihat empat tatasusunan satu dimensi — baris tatasusunan dua dimensi kami. Beginilah cara tatasusunan dua dimensi sebenarnya berfungsi."

"Hebat! Tetapi apa yang ia berikan kepada kita?"

"Memandangkan 'bekas bekas' menyimpan rujukan kepada 'tatasusunan baris', kami boleh menukar baris dengan cepat dan mudah. ​​Untuk mendapatkan 'bekas bekas', anda hanya perlu menentukan satu indeks dan bukannya dua. Contoh:

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

"Lihat kod di bawah. Kita boleh 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;
Tatasusunan dua dimensi





matrix[0]menyimpan rujukan kepada baris pertama.
Kami menukar rujukan.

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

"Faham. Ia berfungsi seperti menukar mana-mana dua barang biasa."

"Begitu juga. Nah, jika anda merujuk kepada sel tatasusunan dua dimensi, tetapi anda hanya menentukan satu indeks selepas nama tatasusunan, maka anda merujuk kepada bekas bekas yang selnya menyimpan rujukan kepada satu- tatasusunan dimensi."

"Semuanya nampak logik dan jelas. Terima kasih atas ceramahnya, Rishi!"

"Anda dialu-alukan. Amalkan dengan bijak."