Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

Array#วิธีซิป

สมมติว่าคุณต้องการเปรียบเทียบสองอาร์เรย์ ทีละองค์ประกอบ เพื่อหาความแตกต่าง

หรือบางทีคุณอาจต้องการหาตัวเลขที่ใหญ่ที่สุดในทุกดัชนี หรือคุณเพียงแค่ต้องการรวมรายการคีย์และรายการค่าเพื่อสร้างแฮช...

… "วิธีที่ยาก" ในการทำเช่นนี้จะมีลักษณะเช่นนี้

ตัวอย่าง :

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 (เช่น Enumerable#zip)!

ตัวอย่าง :

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

อ้า! …ดีขึ้นมาก

ไม่เห็นด้วยเหรอ

หากเราคุ้นเคยกับ zip เราจะเข้าใจทันทีว่าเกิดอะไรขึ้น และหากเราไม่อ่าน การอ่านเอกสารอย่างรวดเร็ว (หรือดีกว่านี้ บทความนี้!) จะอธิบายได้

ข้อดีอีกอย่างของการใช้ zip คือเราสามารถโยงมันกับวิธีการนับอื่นๆ ได้อย่างง่ายดาย

เช่น วิธีการนับ :

a = [1,2,3,4,5]
b = [1,2,3,6,8]

c = a.zip(b).count { |a,b| a == b }

# 3

รหัสนี้ส่งคืนการนับจำนวนองค์ประกอบที่เหมือนกัน &ในตำแหน่งเดียวกัน

เคล็ดลับอีกอย่างที่คุณสามารถใช้ได้ดังที่ได้กล่าวไว้ก่อนหน้านี้คือการรวมรายการคีย์และค่าต่างๆ เข้าด้วยกันเพื่อสร้างแฮช

ตัวอย่าง :

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

a.zip(b).to_h

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

ต้องการตัวอย่างอื่นหรือไม่

ได้เลย!

นี่เลย :

letters = Array('a'..'z')
shift   = 3

translation_map = letters.zip(letters.rotate(shift)).to_h

"hello".chars.map { |ch| translation_map[ch] }.join

นี่เป็นการนำอัลกอริธึมซีซาร์มาใช้อย่างแฟนซี

สรุป

คุณได้เรียนรู้เกี่ยวกับ Array#zip วิธีซึ่งช่วยให้คุณ "รวม" สองอาร์เรย์และทำเทคนิคเจ๋ง ๆ กับสิ่งนั้น 🙂

หากคุณชอบโพสต์นี้ อย่าลืมแชร์ บนโซเชียลเน็ตเวิร์กที่คุณชื่นชอบเพื่อให้คนอ่านได้มากขึ้น!