Computer >> Máy Tính >  >> Lập trình >> Ruby

Array # zip Method

Giả sử bạn muốn so sánh hai mảng, từng phần tử để bạn có thể tìm thấy sự khác biệt.

Hoặc có thể bạn muốn tìm số lớn nhất trên mọi chỉ mục, hoặc bạn chỉ muốn hợp nhất danh sách các khóa và danh sách các giá trị để tạo hàm băm…

… “Cách khó” để làm điều này sẽ trông giống như thế này.

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 đó hoàn thành công việc, nhưng nó không đẹp, phải không?

Ngoài ra, bạn cũng phải dừng lại và suy nghĩ trong một phút để hiểu chuyện gì đang xảy ra.

Đây là lúc Array # zip (cũng có thể là Enumerable # zip) phát huy tác dụng!

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 có đồng ý không?

Nếu chúng ta quen thuộc với zip chúng tôi sẽ hiểu ngay điều gì đang xảy ra. Và nếu chúng ta không làm vậy, hãy đọc nhanh tài liệu (hoặc thậm chí tốt hơn, bài viết này!) Sẽ giải thích điều đó.

Một lợi thế khác của việc sử dụng zip là chúng ta có thể dễ dàng xâu chuỗi nó với các phương thức Enumerable khác.

Chẳng hạn như phương pháp đếm :

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 có bao nhiêu phần tử giống nhau và ở cùng một vị trí.

Một thủ thuật khác mà bạn có thể sử dụng, như tôi đã đề cập trước đây, là hợp nhất danh sách các khóa và giá trị để tạo một hàm băm.

Ví dụ :

a = %w(bacon coconut walnuts)
b = [100, 200, 300]

a.zip(b).to_h

# {"bacon"=>100, "coconut"=>200, "walnuts"=>300}

Muốn một ví dụ khác?

Được rồi!

Đây rồi :

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à một triển khai lạ mắt của thuật toán mật mã caesar.

Tóm tắt

Bạn đã tìm hiểu về Array#zip , cho phép bạn "hợp nhất" hai mảng và thực hiện một số thủ thuật thú vị với đó 🙂

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