Penelusuran Array 2D
| English | Bahasa Indonesia |
|---|---|
| nested loops/ˈnestɪd luːps/ | perulangan bersarang |
| row-major order/rəʊ ˈmeɪdʒə ˈɔːdə/ | urutan baris-utama |
| enhanced for/enˈhænst fɔː/ | for ditingkatkan |
Grid persegi panjang memaparkan batas perulangan yang salah
- Grid memiliki dua baris dan tiga kolom. Perulangan yang dibatasi oleh g.length untuk kedua indeks hanya mengunjungi dua kolom pertama.
- Gunakan r < g.length dan, untuk setiap baris, c < g[r].length. Hal ini juga menangani baris dengan panjang berbeda, sementara g[0].length mengasumsikan grid persegi panjang yang tidak kosong.
Perulangan bersarang untuk grid
- Untuk mengunjungi setiap sel dari array 2-D, gunakan perulangan bersarang (dari Unit 2). Perulangan luar melintasi baris, perulangan dalam melintasi kolom:
for (int r = 0; r < g.length; r++) { for (int c = 0; c < g[r].length; c++) { ... g[r][c] ... } }Perulangan dalam menyapu seluruh baris sebelum perulangan luar berpindah ke baris berikutnya.
Urutan baris-utama
- Penyusunan ini mengunjungi sel-sel dalam urutan baris mayor: seluruh baris 0, kemudian baris 1, … hingga
g[0][0], g[0][1], …, g[1][0], g[1][1], … - Ini adalah urutan bacaan alami — kiri ke kanan, atas ke bawah. Untuk grid persegi panjang yang tidak kosong, kolom dapat dijadikan perulangan luar untuk mengunjungi sel-sel secara per kolom. Array yang tidak rata (ragged array) memerlukan kebijakan eksplisit untuk kolom yang tidak dimiliki oleh beberapa baris.
Versi for-each
- Perulangan for ditingkatkan (enhanced for) atas array 2-D memberikan satu baris (array 1-D) sekaligus.
for (int[] row : g) { for (int x : row) { ... x ... } } - Variabel luar adalah seluruh baris; variabel dalam melintasi nilai-nilai baris tersebut. Variabel loop primitif tidak memperbarui sel yang tersimpan saat direset. Variabel baris tetap merupakan referensi, sehingga loop dalam berbasis indeks dapat memodifikasi
row[c].
Penelusuran baris-utama
Loop luar atas baris, dalam atas kolom: 1,2,3,4,5,6.
Pola manakah di bawah ini yang mengunjungi setiap sel pada array int berdimensi 2 non-null yang referensi barisnya semuanya non-null?
Luar atas baris, dalam atas kolom.
Perulangan luar dari traversal berdimensi 2 baris-baris yang ditampilkan harus dibatasi oleh...
Perulangan baris luar menggunakan g.length; perulangan sel dalam menggunakan g[r].length, yang menangani panjang baris yang tidak sama.
Untuk grid 2 baris, 3 kolom, berapa banyak sel yang dikunjungi loop bersarang?
baris × kolom = 2 × 3 = 6.
Penelusuran baris-utama mengunjungi sel dalam urutan...
Baris-utama = kiri ke kanan, atas ke bawah.
Dalam for (int[] row : g), variabel row adalah...
Variabel for-each luar adalah array baris.
Menggunakan g.length untuk kedua batas perulangan selalu menyebabkan pengecualian pada setiap grid persegi panjang non-persegi.
Salah: dalam grid baris-2, kolom-3, pola ini hanya mengunjungi dua kolom dan secara diam-diam melewatkan sel. Dalam grid yang lebih tinggi daripada lebar, dapat pula melampaui batas baris.
Batas yang benar
- Batas luar:
r < g.length(jumlah baris). Batas dalam:c < g[r].length(panjang baris saat ini). Menggunakan panjang yang salah untuk loop adalah bug halus pada grid non-segitiga. - Untuk grid persegi panjang yang tidak kosong,
g[0].lengthjuga memberikan jumlah kolom umum, dan tubuh loop dalam berjalanrows × columnskali. Untuk baris bertumpuk (ragged rows), tambahkan panjang setiap baris; semua referensi baris harus non-null.
Gunakan g.length untuk baris dan g[r].length untuk sel-sel pada baris saat ini. Menggunakan jumlah baris sebagai kedua batas dapat melewatkan kolom pada grid lebar atau menyebabkan out of bounds pada grid tinggi. Array luar yang kosong tidak memerlukan akses ke g[0]; baris null memerlukan kebijakan penanganan eksplisit sebelum membaca panjangnya.
Order the cells visited in row-major traversal of a 2×2 grid.
The inner loop finishes one row before the outer loop advances.
Untuk int[][] g = {{1, 2, 3}, {}, {4}};, berapa banyak sel yang dikunjungi oleh traversal per-baris?
Jumlahkan panjang baris: 3 + 0 + 1 = 4. Baris kosong tidak menyumbang sel apa pun.
Menjumlahkan array 2-D:
for (int r = 0; r < g.length; r++)for (int c = 0; c < g[r].length; c++)sum += g[r][c];— mengunjungi semua sel satu per satu secara berurutan, dengan asumsi tidak ada baris yang null.
Terapkan penalaran ke kasus baru
- Untuk
int[][] g = {{1, 2, 3}, {}, {4}};, panjang barisnya adalah 3, 0 dan 1*. Batas per-baris mengunjungi empat sel dan totalnya 10*;g[0].lengthbukan batas yang valid untuk setiap baris. - Anda dapat memodifikasi row[c] dengan loop dalam berindeks; mengassig ulang primitive x dalam loop enhanced dalam tidak memperbarui sel.
Lintasi array 2-D dengan loop bersarang: luar atas baris (r < g.length), dalam atas kolom (c < g[r].length*), mengakses g[r][c]. Ini mengunjungi sel dalam urutan baris-major (total panjang baris; rows × columns untuk grid persegi panjang). Enhanced for (for (int[] row : g)) memberikan referensi satu baris sekaligus; penugasan pada variabel loop dalam primitif tidak mengubah sel yang tersimpan.