Array menyimpan sekumpulan nilai dalam satu urutan dan merupakan koleksi yang paling sering digunakan dalam program Ruby. Topik ini membahas pembuatan array, pembacaan elemen melalui indeks positif maupun negatif, metode yang umum digunakan, serta array bersarang. Setelah membacanya, pembuatan, pembacaan, dan pengolahan daftar nilai dapat dilakukan dengan mengenali perilaku setiap metode yang terlibat.
Membuat array#
Bentuk array yang paling umum ditulis dengan meletakkan daftar nilai di dalam tanda kurung siku dan memisahkannya dengan koma. Isi array tidak harus bertipe sama, sehingga satu array boleh memuat bilangan, string, dan symbol sekaligus. Ruby juga menyediakan bentuk penulisan khusus untuk daftar kata, yaitu %w[] yang memecah isi berdasarkan spasi, serta Array.new yang membuat array berisi nilai yang sama secara berulang.
belanja = ["beras", "gula", "minyak"]
kosong = []
campur = [1, "dua", :tiga, 4.0]
dari_w = %w[senin selasa rabu]
nol = Array.new(3, 0)
p belanja
p kosong
p campur
p dari_w
p nol["beras", "gula", "minyak"]
[]
[1, "dua", :tiga, 4.0]
["senin", "selasa", "rabu"]
[0, 0, 0]Bentuk %w[senin selasa rabu] menghasilkan array berisi tiga string tanpa perlu menulis tanda kutip dan koma untuk setiap katanya. Pemanggilan Array.new(3, 0) menghasilkan [0, 0, 0], yaitu array berisi tiga angka nol. Array kosong ditulis [] dan menjadi titik awal yang lazim ketika isinya baru diketahui saat program berjalan.
Pengindeksan dan indeks negatif#
Setiap elemen array memiliki indeks, yaitu nomor posisi yang dihitung mulai dari nol pada elemen pertama. Pembacaan elemen menggunakan tanda kurung siku, misalnya suhu[0] untuk elemen pertama. Indeks negatif menghitung posisi dari akhir, sehingga suhu[-1] adalah elemen terakhir dan suhu[-2] elemen tepat sebelumnya. Rentang indeks juga dapat digunakan, misalnya suhu[1..3] yang mengambil elemen dari indeks 1 sampai 3 sekaligus.
suhu = [26, 27, 29, 30, 28]
p suhu[0]
p suhu[2]
p suhu[-1]
p suhu[-2]
p suhu[1..3]
p suhu[10]26
29
28
30
[27, 29, 30]
nilDiagram berikut memperlihatkan kedua arah penomoran pada satu array yang sama.
Baris terakhir keluaran memperlihatkan perilaku yang penting untuk diingat, yaitu akses di luar jangkauan array menghasilkan nil, bukan error. Karena itu, jumlah elemen dapat diperiksa melalui length sebelum sebuah indeks digunakan.
Metode array yang umum#
Array menyediakan metode siap pakai untuk menambah, menghapus, memeriksa, dan merapikan isinya. Metode push menambah elemen di akhir dan memiliki bentuk singkat <<, sedangkan unshift menambah elemen di awal. Pemeriksaan jumlah dan keanggotaan menggunakan length serta include?, sedangkan ujung array dibaca dengan first dan last. Metode sort mengurutkan, join menyambung seluruh elemen menjadi satu string, dan delete menghapus elemen yang nilainya cocok.
# Operasi umum pada array daftar belanja.
belanja = ["beras", "gula", "minyak"]
belanja.push("telur") # menambah di akhir
belanja << "teh" # bentuk singkat push
belanja.unshift("garam") # menambah di awal
p belanja
p belanja.length
p belanja.include?("gula")
p belanja.first
p belanja.last
p belanja.sort
p belanja.join(", ")
terpakai = belanja.delete("minyak")
p terpakai
p belanja["garam", "beras", "gula", "minyak", "telur", "teh"]
6
true
"garam"
"teh"
["beras", "garam", "gula", "minyak", "teh", "telur"]
"garam, beras, gula, minyak, telur, teh"
"minyak"
["garam", "beras", "gula", "telur", "teh"]Ketiga metode penambahan di awal program bekerja pada array yang sama, sehingga keluaran pertama memuat enam barang dalam urutan penyisipannya. Metode sort mengembalikan array baru yang terurut dan membiarkan array aslinya utuh, sedangkan delete mengembalikan nilai yang dihapus, yaitu "minyak", sehingga array pada baris terakhir keluaran sudah kehilangan elemen itu. Urutan elemen array ditentukan oleh penyisipan dan penghapusan yang sudah dilakukan, bukan oleh hasil pengurutan terakhir.
Metode ringkas lain berikut sering digunakan untuk memangkas kerja manual pada array bilangan.
angka = [3, 1, 3, 2, 1]
p angka.uniq
p angka.sort
p angka.reverse
p angka.sum
p angka.max
p angka.min[3, 1, 2]
[1, 1, 2, 3, 3]
[1, 2, 3, 1, 3]
10
3
1Metode uniq membuang duplikat dengan mempertahankan kemunculan pertamanya, reverse membalik urutan tanpa mengurutkan, sedangkan sum, max, dan min langsung menjawab pertanyaan agregasi yang paling sering muncul. Semuanya mengembalikan hasil baru, dan array angka tetap tidak berubah.
Array bersarang#
Elemen array boleh berupa array lain, dan susunan semacam ini disebut array bersarang (nested array). Bentuk ini lazim untuk data dua arah, misalnya bacaan suhu pagi dan sore selama beberapa hari. Elemen dalamnya dibaca dengan indeks bertingkat, yaitu indeks luar menunjuk hari dan indeks dalam menunjuk sesi pengukurannya.
suhu_sepekan = [
[24, 29],
[23, 28],
[25, 30]
]
p suhu_sepekan[0]
p suhu_sepekan[0][1]
p suhu_sepekan[2][0]
p suhu_sepekan.length
p suhu_sepekan.flatten
p suhu_sepekan.flatten.max[24, 29]
29
25
3
[24, 29, 23, 28, 25, 30]
30Ekspresi suhu_sepekan[0] mengembalikan array hari pertama, sedangkan suhu_sepekan[0][1] melangkah satu tingkat lagi hingga suhu sore pada hari pertama. Metode length tetap menghitung dari tingkat terluar, sehingga hasilnya tiga, yaitu jumlah hari, bukan jumlah bacaan. Apabila seluruh isi perlu diperlakukan sebagai satu deret, flatten meratakannya menjadi enam suhu dan langsung dapat dirangkai dengan metode lain seperti max.
Kesalahan umum#
Kesalahan pertama adalah memperlakukan hasil akses di luar jangkauan seolah-olah sebuah angka. Array tidak memunculkan error saat indeksnya melewati jangkauan, melainkan mengembalikan nil, sehingga baris yang gagal dapat berada jauh dari sumber masalahnya.
# tidak-dijalankan
suhu = [26, 27, 29]
p suhu[10] + 1Ekspresi suhu[10] bernilai nil, dan nil + 1 memunculkan NoMethodError karena nil tidak mengenal operasi penjumlahan.
Kesalahan kedua terjadi saat Array.new digunakan untuk membuat array bersarang dengan satu nilai awal. Nilai awal yang diberikan berupa satu objek yang sama dan dibagikan ke seluruh sel, bukan disalin untuk setiap sel.
matriks = Array.new(3, [])
matriks[0].push(1)
p matriks
matriks2 = Array.new(3) { [] }
matriks2[0].push(1)
p matriks2[[1], [1], [1]]
[[1], [], []]Keluaran pertama memperlihatkan satu angka muncul di tiga tempat sekaligus karena ketiga sel menunjuk array yang sama. Bentuk kedua menyertakan blok, sehingga Ruby menjalankan { [] } sebanyak tiga kali dan menghasilkan tiga array yang berbeda. Untuk array bersarang, gunakan bentuk blok agar setiap sel mempunyai arraynya sendiri.
Ringkasan#
- Array ditulis di dalam tanda kurung siku,
%w[]membuat array kata tanpa tanda kutip, danArray.newmengisi array dengan nilai yang sama secara berulang. - Indeks positif dihitung dari nol di awal, indeks negatif dihitung dari
-1di akhir, dan akses di luar jangkauan menghasilkannil. - Metode seperti
push,unshift,delete,sort,join, danflattenmenangani penambahan, penghapusan, pemeriksaan, dan perapian elemen. - Elemen array boleh berupa array lain yang dibaca dengan indeks bertingkat seperti
suhu[0][1].
Referensi#
- Array — Ruby — Dokumentasi resmi Array beserta seluruh metode pembuatan, pengindeksan, dan pengubahannya.
- Literals — Ruby
— Bagian dokumentasi sintaks tentang penulisan array literal, termasuk bentuk
%w[].