Operasi pada Array di Ruby

posted to Ruby on 16 December 2017

Array atau Larik merupakan salah satu bentuk struktur data pada Ruby yang dapat menyimpan banyak data, disebut dengan elemen, dengan suatu nama yang sama dan menempati tempat di memori yang berurutan (kontigu) serta bertipe data sama. Pada Ruby array dapat berisi berbagai macam tipe data seperti angka, string, dan object Ruby lainnya. Ketika kita memiliki data dalam bentuk array, kita dapat melakukan beberapa operasi seperti mengurutkan, menghapus duplikasi, membalik urutan, mengambil sebagian dari array, melakukan transformasi data, dan menjadikan sebuah array kedalam satu nilai tertentu.

Pada kesempatan kali ini kita akan melakukan eksplorasi method yang bisa kita gunakan dalam melakukan operasi pada array. Beberapa method yang akan kita gunakan mungkin akan terasa baru, seperti method yang menggunakan tanda seru (!) atau method dengan tanda tanya(?). Untuk method dengan tanda seru (!), berarti method tersebut memiliki efek samping seperti merubah array asli tanpa melakukan proses penyalinan atau memunculkan exception. Sedangkan method dengan tanda tanya (?), menunjukkan bahwa method tersebut mengembalikan nilai boolean.

Akses Elemen pada Array

Seperti pada bahasa Python, array pada Ruby dapat diakses langsung dengan menggunakan nomor indeksnya(dimulai dari 0) seperti berikut:

languages = ["Ruby", "Javascript", "Python"]
languages[0]    # "Ruby"
languages[1]    # "Javascript"
languages[2]    # "Python"

Selain itu kita dapat menggunakan method .first dan juga .last untuk mengakses elemen pertama dan terakhir dari sebuah array seperti berikut:

languages = ["Ruby", "Javascript", "Python"]
languages.first     # "Ruby"
languages.last      # "Python"

Jika kita mengakses indeks yang tidak ada, kita akan mendapatkan nil. Namun jika ingin memperoleh nilai galat, kita dapat menggunakan method .fetch seperti berikut:

languages = ["Ruby", "Javascript", "Python"]
languages.fetch(42)     # IndexError: index 42 outside of array bounds: -3...3
languages.fetch(42, "None")     # "None"

Mengambil Beberapa Elemen dari Array

Ada saatnya kita perlu mengambil beberapa elemen dari sebuah array, hal ini dapat dilakukan dengan menentukan nilai awal dari indeks array dilanjutkan dengan jumlah elemen yang kita perlukan seperti berikut:

languages = ["Ruby", "Javascript", "Python", "Haskell"]
languages[1,2]  # ["Javascript", "Python"]

Pada potongan kode di atas, kita memulai dari indeks 1, berisi "Javascript", dan kita mengambil 2 elemen, dan kita mendapatkan array baru berisi "Javascript" dan "Python". Selain menggunakan metode tersebut kita dapat menggunakan method .slice

languages = ["Ruby", "Javascript", "Python", "Haskell"]
languages.slice(1,2)    # ["Javascript", "Python"]

Yang perlu diperhatikan adalah ketika menggunakan method .slice maka kita akan mendapatkan array baru tanpa merubah array asli. Namun jika kita menggunakan method .slice! maka array asli akan berubah.

Method lain yang bisa kita gunakan adalah .take, dimana method ini akan memberikan kita jumlah elemen yang kita perlukan dimulai dari indeks pertama array seperti berikut:

languages = ["Ruby", "Javascript", "Python", "Haskell"]
languages.take(2)   # ["Ruby", "Javascript"]

Mendapat Nilai Acak dari Array

Terkadang kita memerlukan nilai acak untuk menentukan hasil undian, dengan menggunakan array kita dapat menggunakan nilai awal dan akhir indeks untuk kemudian menghasilkan nilai acak. Namun cara termudah adalah dengan menggunakan method .sample seperti berikut:

languages = ["Ruby", "Javascript", "Python", "Haskell"]
languages.sample        # Python
languages.sample(2)     # ["Ruby", "Javascript"]

Method .sample juga menerima argumen untuk menentukan jumlah elemen acak yang kita perlukan.

Pencarian dan Penyaringan Array

Ketika mencari sebuah elemen dari array umumnya kita akan melakukan iterasi pada array hingga menemukan elemen yang dimaksud. Kita dapat menggunakan method .include?, yang menghasilkan nilai boolean ketika data yang dimaksud ditemukan atau tidak.

languages = ["Ruby", "Javascript", "Python", "Haskell"]
languages.include? "Haskell"    # true
languages.include? "Elixir"     # false

Perlu diketahui, method .include? membutuhkan nilai yang benar-benar cocok, kita tidak dapat melakukan pencarian dengan nilai parsial seperti berikut:

languages = ["Ruby", "Javascript", "Python", "Haskell"]
languages.include? "Java"       # false
languages.include? "Rub"        # false
languages.include? "py"         # false

Method lainnya adalah .find, dimana method ini akan mengembalikan nilai pertama muncul yang sesuai dengan spesifikasi yang kita berikan, berikut contoh penggunaan .find:

languages = ["Ruby", "Javascript", "Python", "Haskell"]
languages.find {|language| language.include?("o")} # "Python"

Selain .find kita juga dapat menggunakan .select untuk menghasilkan array baru berisi hasil yang sesuai dengan spesifikasi yang kita berikan, berikut contoh:

languages = ["Ruby", "Javascript", "Python", "Haskell"]
languages.select {|language| language.include?("a")}

# ["Javascript", "Haskell"]

Sedangkan untuk menghasilkan array baru yang tidak sesuai spesifikas, kita dapat menggunakan method .reject, berikut contoh:

languages = ["Ruby", "Javascript", "Python", "Haskell"]
languages.reject {|language| language.include("a")}

# ["Ruby", "Python"]

Sama seperti sebelumnya method .select dan .reject juga menghasilkan array baru tanpa merubah array asli. Namun .select! dan .reject! mengubah array asli.

Mengurutkan Data pada Array

Proses pengurutan array dapat dilakukan dengan method .sort seperti berikut:

languages = ["Ruby", "Javascript", "Python", "Haskell"]
languages.sort      # ["Haskell", "Javascript", "Python", "Ruby"]

Jika ingin membalik urutan, kita dapat menggunakan method .reverse seperti berikut:

languages = ["Haskell", "Javascript", "Python", "Ruby"]
languages.reverse   # ["Ruby", "Python", "Javascript", "Haskell"]

Proses pengurutan data dengan method .sort dapat berubah menjadi kompleks, untuk melakukan pengurutan yang lebih kompleks kita dapat menggunakan operator pembanding (<=>) pada Ruby. Operator ini membandingkan objek Ruby sebagai berikut:

1 <=> 2     # -1
2 <=> 2     # 0
2 <=> 1     # 1

Berikut adalah contoh penggunaan operator pembanding dengan method .sort:

languages = ["Ruby", "Javascript", "Python", "Haskell"]
languages.sort {|a,b| a <=> b}

# ["Haskell", "Javascript", "Python", "Ruby"]

Seperti method sebelumnya .sort juga akan memberikan array baru tanpa mengubah array asli, gunakan .sort! jika kamu perlu mengubah array asli.

Menghapus Duplikasi Elemen

Ketika kita menggabungkan dua atau lebih array kemungkinan kita akan mendapatkan nilai duplikasi

lang1 = ["Ruby", "Python"]
lang2 = ["Python", "Haskell"]
lang3 = ["Javascript", "Elixir"]

lang1 + lang2 + lang3
# ["Ruby", "Python", "Python", "Haskell", "Javascript", "Elixir"]

Kita dapat menggunakan method .uniq untuk menghapus duplikasi tersebut

languages = ["Ruby", "Python", "Python", "Haskell", "Javascript", "Elixir"]
languages.uniq  # ["Ruby", "Python", "Haskell", "Javascript", "Elixir"]

Namun selain menggunakan method .uniq, ketika proses penggabungan kita dapat menggunakan operator pipa | untuk menghindari duplikasi seperti berikut:

lang1 = ["Ruby", "Python"]
lang2 = ["Python", "Haskell"]

lang1 + lang2
# ["Ruby", "Python", "Python", "Haskell"]

Transformasi Data Array

Untuk melakukan transformasi pada sebuah array, kita perlu melakukan operasi pada tiap elemen array tersebut. Hal ini dapat dilakukan dengan menggunakan method .map, berikut adalah contoh sederhana untuk menjumlahkan tiap elemen array dengan 2:

numbers = [1, 2, 3, 4, 5]
numbers.map {|number| number + 2}

# [3, 4, 5, 6, 7]

Sama seperti method sebelumnya .map juga memiliki .map! jika diperlukan untuk mengubah array asli.

Mereduksi Array

Mungkin kita pernah dihadapkan kondisi untuk menjumlahkan nilai pada sebuah array. Hal ini dapat dilakukan dengan menggunakan method .reduce berikut contoh:

numbers = [1, 2, 3, 4, 5]
numbers.reduce(0) {|result, current| result += current}

# 15

Dan method .reduce juga bisa menggunakan binary method, sehingga cara diatas dapat ditulis sebagai berikut:

numbers = [1, 2, 3, 4, 5]
numbers.reduce(:+)

# 15

Kesimpulan

Pada kesempatan ini kita telah melakukan beberapa operasi pada array termasuk didalamnya mengakses elemen, melakukan pencarian pada array, mengurutkan array, dan beberapa hal lainnya. Operasi pada array tersebut cukup berguna dalam memecahkan masalah yang sering dihadapi ketika melakukan pemrograman dengan Ruby.


Pair With Me!
Comments? Contact me via Twitter or e-mail.