12/08/2018, 18:20

Ruby Array

Trong ruby, ta thường sửa dụng 2 class Array và Hash để lưu trữ và truy vấn sữ liệu. Hôm nay mình sẽ viết 1 bài về các phương thức thường được sử dụng của Array, bài về Hash hẹn tháng sau nhé (yaoming). 1. Khởi tạo array: Ruby cung cấp nhiều cách khởi tạo array khác nhau. Khởi tạo array và ...

Trong ruby, ta thường sửa dụng 2 class Array và Hash để lưu trữ và truy vấn sữ liệu. Hôm nay mình sẽ viết 1 bài về các phương thức thường được sử dụng của Array, bài về Hash hẹn tháng sau nhé (yaoming).

1. Khởi tạo array:

  • Ruby cung cấp nhiều cách khởi tạo array khác nhau.
  • Khởi tạo array và gán giá trị cho các phần tử:
arr = [1, "two", 3.0] # [1, "two", 3.0]
  • Khởi tại array rỗng:
arr = Arrray.new # []
  • Khởi tạo array với số lượng phần từ biết trước:
arr = Array.new(3)    # [nil, nil, nil]
arr = Array.new(3, 1) # [1, 1, 1]
  • Khởi tạo array và truyền vào block để khởi tạo giá trị cho các phần từ của mảng:
arr = Array.new(3) {|i| i.to_s} # [0, 1, 2]

2. Truy vấn các phần tử của array:

a. Hàm [] với 1 tham số:

  • Index các phần tử của phần tử trong array được tính bắt đầu từ 0 (tương tự như C hay Java).
  • Mỗi phần tử được lưu trong array có thể là bất kỳ object nào trong ruby.
  • Do đó các phần tử của array trong Ruby được truy vấn theo index tính từ 0 và tăng dần đến cuối array (index tăng dần theo thứ tự, 0, 1, ... tăng dần đến cuối array).
  • Tuy nhiên trong Ruby, các phần tử của array cũng có thể được truy vấn theo index tính từ -1 và giảm dần đến đầu array (index giảm dần theo thứ tự -1, -2, ... giảm dần đến đầu array)
  • Khi truy vấn 1 phần tử có index nằm ngoải array thì ruby trả về nil
  • Ví dụ ta có array có 5 phần tử
arr = ["one", "two", "three", "four", "five"]
  • Khi đó
arr[0] # "one"
...
arr[4] # "five"
arr[5] # nil

arr[-1] # "five" (= arr[4])
...
arr[-5] # "one" (= arr[0])
arr[-6] # nil

b. Hàm [] với nhiều tham số:

  • Cách truy vấn trên trả về 1 phần tử có trong array, để trả về 1 mảng con các phần tử liên tiếp ta thay đổi các tham số truyền vào hàm [], có thể truyền vào 2 số nguyên hoặc 1 range
  • Ví dụ ta có array 5 phần tử
arr = ["one", "two", "three", "four", "five"]
  • Khi đó
arr[1, 3] # ["two", "three", "four"]
(array con 3 phần tử liên tiếp, tính từ arr[1])

arr[1..3] # ["two", "three", "four", "five"]
(array con từ arr[1]...arr[3])

c. Hàm at(), first(), last():

  • Hàm at() nhận 1 tham số và hoạt động tương tự hàm [] nhận 1 tham số
  • Ví dụ ta có array 5 phần tử
arr = ["one", "two", "three", "four", "five"]
  • Khi đó
arr.at(0) # "one" (= arr[0])
...
arr.get(4) # "five" (= arr[4])
arr.get(5) # nil

arr.get(-1) # "five" (= arr[-1 ])
...
arr.at(-5) # "one" (= arr[0])
arr.at(-6) # nil

arr.first() # "one" (= arr[0])
arr.last() # "five" (= arr[4])

d. Hàm take(), drop():

  • Hàm take() và drop() trả về array mới và không thay đổi array gọi hàm.
  • Hàm take(n) trả về array mới n phần tử đầu tiên.
  • Hàm drop(n) trả về array mới là phần còn lại của array gọi hàm sau khi xóa n phần tử đầu tiên.
  • Ví dụ ta có array 5 phần tử
arr = ["one", "two", "three", "four", "five"]
  • Khi đó
arr.take(3) # ["one", "two", "three"]
arr         # ["one", "two", "three", "four", "five"]

arr.drop(3) # ["four", "five"]
arr         # ["one", "two", "three", "four", "five"]

e. Hàm empty?(), include?():

  • Hàm empty?() cho ta biết array đó có rỗng hay không.
  • Hàm include?() cho ta biết array gọi hàm có chứa phần tử được truyền vào hàm hay không.
  • Ví dụ ta có array 5 phần tử
arr = ["one", "two", "three", "four", "five"]
empty_arr = []
  • Khi đó
arr.empty?       # false
empty_arr.empty? # true

arr.include?(1)     # false
arr.include?("one") # true

f. Hàm count(), length() và size() (alias của length()):

  • Hàm count(), length() khi không truyền tham số sẽ trả về số phần tử có trong array.
  • Hàm count() khi truyền vào block sẽ trả về số phần tử trong array thỏa điều kiện.
  • Ví dụ ta có array 5 phần tử
arr = ["one", "two", "three", "four", "five"]
  • Khi đó
arr.count  # 5
arr.length # 5

arr.count("one")                  # 1 (["one"])
arr.count {|obj| obj.length == 3} # 2 (["one", "two"])

3. Thêm phần tử vào array:

a. Hàm push():

  • Hàm push() có tác dụng thêm 1 phần tử vào cuối array.
  • Ta có thể sử dụng toán tử << để thêm 1 phần tử vào array tương tự như hàm push().
  • Ví dụ ta có array 5 phần tử
arr = [0, 1, 2, 3, 4, 5]
  • Khi đó
arr.push(6) # [0, 1, 2, 3, 4, 5, 6]
arr         # [0, 1, 2, 3, 4, 5, 6]

arr << 7 #[1, 2, 3, 4, 5, 6, 7]
arr      # [0, 1, 2, 3, 4, 5, 6]

b. Hàm unshift():

  • Hàm push() có tác dụng thêm 1 phần tử vào cuối arry
  • Hàm unshift() thì ngược lại, có tác dụng thêm 1 phần tử vào đầu array.
  • Ví dụ ta có array 5 phần tử
arr = [0, 1, 2, 3, 4, 5]
  • Khi đó
arr.unshift(6) # [6, 0, 1, 2, 3, 4, 5]
arr            # [6, 0, 1, 2, 3, 4, 5]

c. Hàm insert():

  • Hàm push() và unshift() có tác dụng thêm 1 phần tử vào array tại vị trí xác định.
  • Để thêm nhiều phần tự vào mảng tại 1 index cho trước, ta sử dụng hàm insert().
  • Ví dụ ta có array 5 phần tử
arr = [0, 1, 2, 3, 4, 5]
  • Khi đó
arr                            # [0, 1, 2,                  3, 4, 5]
arr.insert(3, "three", "four") # [0, 1, 2, "three", "four", 3, 4, 5]
arr                            # [0, 1, 2, "three", "four", 3, 4, 5]

4. Xóa phần tử khỏi array:

a. Hàm pop():

  • Hàm pop() xóa phần tử cuối ra khỏi array và trả về phần tử đó.
  • Ví dụ ta có array 5 phần tử
arr = [0, 1, 2, 3, 4, 5]
  • Khi đó
arr.pop() # 5
arr       # [0, 1, 2, 3, 4]

b. Hàm shift():

  • Hàm shift() xóa phần tử đầu tiên ra khỏi array và trả về phần tử đó.
  • Ví dụ ta có array 5 phần tử
arr = [0, 1, 2, 3, 4, 5]
  • Khi đó
arr.shift() # 0
arr         # [1, 2, 3, 4, 5]

c. Hàm delete_at():

  • Hàm delete() xóa phần từ của aray tại vị trí truyền vào hàm và trả về phần tử đó.
  • Ví dụ ta có array 5 phần tử
arr = [0, 1, 2, 3, 4, 5]
  • Khi đó
arr.delete_at(1) # 1
arr              # [0, 2, 3, 4, 5]

d. Hàm delete():

  • Hàm delete() xóa tất các các phần tử trong array khớp với giá trị được truyền vào hàm.
  • Nếu gia trị truyền vào hàm có trong array thì hàm trả về giá trị đó, không thì trả về nil.
  • Ví dụ ta có array 5 phần tử
arr = [0, 1, 2, 0, 5]
  • Khi đó
arr.delete(1) # 1
arr           # [0, 2, 0, 5]
arr.delete(6) # nil
arr           # [0, 2, 0, 5]

e. Hàm delete_if():

  • Hàm delet_if() xóa tất cả các phần tử thỏa mãm điều kiện truyền vào trong block.
  • Ví dụ ta có array 5 phần tử
arr = [0, 1, 2, 0, 5]
  • Khi đó
arr.delete_if {|a| a > 1} # [0, 1, 0]
arr                       # [0, 1, 0]

f. Hàm keep_if():

  • Hàm keep_if() có chức năng ngược lại hàm delete_if(), thực hiện xóa tất cả các phần tử không thỏa mãn điều kiện truyền vào trong block.
  • Ví dụ ta có array 5 phần tử
arr = [0, 1, 2, 0, 5]
  • Khi đó
arr.keep_if {|a| a > 1} # [2, 5]
arr                     # [2, 5]

g. Hàm compact() và compact!():

  • Hàm compact() và compact!() đều thực hiện xóa tất cả các giá trị niltrong array và trả về array không có các phần tử nil.
  • Tuy nhiên hàm compact() không thay đổi giá trị của array gọi hàm còn hàm compact!() thì có.
  • Ví dụ ta có array 5 phần tử
arr = [0, 1, nil, 3, nil]
  • Khi đó
arr.compact()  # [0, 1, 3]
arr            # [0, 1, nil, 3, nil]
arr.compact!() # [0, 1, 3]
arr            # [0, 1, 3]

h. Hàm uniq():

  • Hàm uniq() xóa tất các phần tử bị lặp có trong array.
  • Ví dụ ta có array 5 phần tử
arr = [0, 1, 1, 3, 4]
  • Khi đó
arr.uniq()  # [0, 1, 3, 4]
arr         # [0, 1, 3, 4]
0