Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Thành thạo Array#zip trong Ruby: Ghép cặp & So sánh mảng hiệu quả

Giả sử bạn muốn so sánh hai mảng, phần tử theo phần tử để tìm khác biệt.

Hoặc tìm số lớn nhất tại mỗi index, hoặc chỉ muốn gộp danh sách key & value để xây hash…

…“cách khó” trông như sau.

Ví dụ:

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]]

Điều đó xong việc, nhưng không đẹp, đúng?

Thêm vào đó, bạn phải dừng & suy nghĩ một lúc để hiểu chuyện gì xảy ra.

Đây là nơi Array#zip (cũng Enumerable#zip) xuất hiện!

Ví dụ:

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]]

Aha! …tốt hơn nhiều.

Bạn đồng ý không?

Nếu quen zip chúng ta ngay lập tức hiểu chuyện gì xảy ra. Nếu không, đọc nhanh tài liệu (hoặc tốt hơn, bài này!) sẽ giải thích.

Lợi thế khác của zip là dễ dàng chuỗi (chain) với phương thức Enumerable khác.

Ví dụ, phương thức count:

a = [1,2,3,4,5]
b = [1,2,3,6,8]
c = a.zip(b).count { |a,b| a == b } # 3

Mã này trả về số lượng chính xác phần tử giống nhau & cùng vị trí.

Mẹo khác, như đã nói, gộp danh sách key & value xây hash.

Ví dụ:

a = %w(bacon coconut walnuts)
b = [100, 200, 300]
a.zip(b).to_h # {"bacon"=>100, "coconut"=>200, "walnuts"=>300}

Muốn ví dụ nữa?

Ổn!

Đây nó:

letters = Array('a'..'z')
shift = 3
translation_map = letters.zip(letters.rotate(shift)).to_h
"hello".chars.map { |ch| translation_map[ch] }.join

Đây là triển khai fancy của thuật toán Caesar cipher.

Tóm tắt

Bạn đã học về phương thức Array#zip, cho phép “ghép” hai mảng & làm vài trò hay 🙂

Nếu thích bài này đừng quên chia sẻ trên mạng xã hội yêu thích để nhiều người đọc!