Array#zip Method
Bài đăng này đã không được cập nhật trong 6 năm
Introduce
Giả sử bạn muốn so sánh hai mảng, theo từng cặp phần tử để bạn có thể tìm thấysự khác biệt. Hoặc bạn muốn tìm giá trị lớn nhất theo từng vị trí của 2 mảng, hoặc bạn muốn hợp nhất 1 mảng key và 1 mảng value thành 1 hash. Để làm điều trên ta có thể implement như sau:
a = [1,2,3,4,5]
b = [1,2,3,6,8]
c = a.map.with_index { |_, idx| [a[idx], b[idx]] }
# [[1, 1], [2, 2], [3, 3], [4, 6], [5, 8]]
Array#zip method
Cách trên đã giải quyết được yêu cầu, nhưng nó cũng làm chúng ta mất 1 chút thời gian để đọc hiểu xem đoạn code trên làm gì.
Ruby
cung cấp cho chúng ta 1 method Array#zip
để làm điều này đơn giản và làm được nhiều thứ hơn.
Chúng ta xem ví dụ sau:
a = [1,2,3,4,5]
b = [1,2,3,6,8]
c = a.zip(b)
# [[1, 1], [2, 2], [3, 3], [4, 6], [5, 8]]
Nếu chúng ta sử dụng và quen với zip
method thì chúng ta sẽ hiểu ngay điều gì đang xảy ra.
Bên cạnh đó, sử dụng zip
thì ta có thể dễ dàng kết nối với các Enumerable
method khác.
a = [1,2,3,4,5]
b = [1,2,3,6,8]
c = a.zip(b).count { |a,b| a == b }
# 3
Đoạn code trên trả về chính xác có bao nhiêu phần tử giống nhau và ở cùng một vị trí.
Một kỹ thuật khác mà bạn có thể sử dụng, như tôi đã đề cập trước đó, là để hợp nhất một danh sách các key & value để xây dựng một hash
.
a = %w(bacon coconut walnuts)
b = [100, 200, 300]
a.zip(b).to_h
# {"bacon"=>100, "coconut"=>200, "walnuts"=>300}
Hoặc sau đây là một ví dụ sử dụng zip
để implement caesar cipher
algorithm.
letters = Array('a'..'z')
shift = 3
translation_map = letters.zip(letters.rotate(shift)).to_h
"hello".chars.map { |ch| translation_map[ch] }.join
Summary
Bạn đã biết về phương pháp Array#zip
, cho phép bạn "merge" hai mảng và làm một số điều thú vị với kết qủa từ zip
method.
Nếu có điều gì thú vị khi sử dụng với zip
method, các bạn có thể comment đóng góp.
Bài viết được dịch từ:
All rights reserved