Ruby's Array # shift ทำอะไรได้บ้าง?


90

ฉันรู้สึกลำบากในการทำความเข้าใจว่าการเปลี่ยนและวิธีการยกเลิกการเปลี่ยนของคลาส Array ทำใน Ruby อย่างไร ใครช่วยให้ฉันเข้าใจสิ่งที่พวกเขาทำ


171
เมื่อคุณเรียนรู้แล้วว่าshift/unshiftเหมือนpush/popที่ปลายอีกด้านหนึ่งของอาร์เรย์คุณสามารถวาง 'f' จากชื่อของเมธอดได้ในใจเพื่อจดจำว่าองค์ประกอบใด "ทิ้ง" และองค์ประกอบใด "แทรก" :)
Phrogz

1
ขอบคุณที่ช่วยได้จริงฮ่า ๆ
agentbanks217

หนึ่งในความคิดเห็นที่ดีที่สุดที่เคยมีมา! ขอบคุณมาก :)
tvdeyen

18
@Phrogz จริงๆแล้วระบบย่อยอาหารของสัตว์มีกระดูกสันหลังถูกจำลองเป็นคิวได้ดีกว่าแบบกอง
Jian

8
@Jian :) ขวา: pushอยู่ด้านบนและshiftออกไปอีกด้านหนึ่ง
Phrogz

คำตอบ:


99

ดูเอกสาร Ruby

Array.shift ลบองค์ประกอบแรกออกจากอาร์เรย์และส่งคืน

a = [1,2,3] 
puts a.shift
 => 1 
puts a
 => [2, 3] 

Unshift นำค่าที่ระบุไว้ด้านหน้าอาร์เรย์เลื่อนองค์ประกอบอื่น ๆ ทั้งหมดขึ้นหนึ่ง

a=%w[b c d]
 => ["b", "c", "d"] 
a.unshift("a")
 => ["a", "b", "c", "d"] 

9
โดยทั่วไปคุณสามารถคิดว่าการเปลี่ยนแปลงและการยกเลิกการเปลี่ยนแปลงเป็นการดำเนินการในคิว FIFO
Jaco Pretorius

@JacoPretorius หือ? shiftและunshiftทำหน้าที่เหมือนกอง FILO pushและshiftจะทำหน้าที่เหมือนคิว FIFO เว้นแต่ฉันจะสับสนเกี่ยวกับบางสิ่ง
Greg Schmit

@GregSchmit อ่าคุณพูดถูก หรือจริงๆแล้วคิว LIFO ใช่มั้ย?
Jaco Pretorius

@JacoPretorius อืมฉันคิดว่า LIFO == FILO (ก่อนอื่นหมายความว่าอันสุดท้ายในต้องออกมาก่อนหากรูปแบบมี)
Greg Schmit

@JacoPretorius ทั้ง LIFO และ FILO หมายถึง "ทำตัวเหมือนกอง"
Greg Schmit

54

shiftและunshiftทำหน้าที่ในลักษณะเดียวกับpopและpush: พวกเขามีจุดมุ่งหมายเพื่อใช้อาร์เรย์เป็นสแต็กที่คุณสามารถต่อท้ายและลบองค์ประกอบได้ (โดยปกติจะเป็นหนึ่งครั้งต่อครั้ง) ความแตกต่างคือเพียงแค่นั้นshiftและunshiftเพิ่ม / ลบองค์ประกอบที่จุดเริ่มต้นของนั้นArrayจริงเปลี่ยนไอเอ็นจีองค์ประกอบอื่น ๆ ทั้งหมดในขณะpopและpushเพิ่ม / ลบองค์ประกอบในตอนท้ายของArrayเพื่อรักษาดัชนีองค์ประกอบอื่น ๆ

ตัวอย่าง:

                      # Spacing for clarity:
a = [2, 4, 8]    # a =>       [2, 4, 8]
a.push(16, 32)   # a =>       [2, 4, 8, 16, 32]
a.unshift(0, 1)  # a => [0, 1, 2, 4, 8, 16, 32]
a.shift          # a =>    [1, 2, 4, 8, 16, 32]
a.pop            # a =>    [1, 2, 4, 8, 16]

หากคุณต้องการแก้ไขคำตอบของคุณเพื่อสรุปกระทู้ mipadi ฉันยินดีที่จะโหวตให้คะแนน
Steven Sudit

เย็น. นอกจากนี้ฉันไม่ค่อยมีความรู้เกี่ยวกับ Ruby แต่ถ้ามันทำงานบน JVM ฉันก็คาดหวังว่า push / pop จะเร็วขึ้นเพราะไม่จำเป็นต้องย้ายองค์ประกอบเหล่านั้นทั้งหมด
Steven Sudit

โหวตให้กับการเปรียบเทียบแบบสแต็ก แต่คิดถึงท่อ ในขณะที่เราควรจะเป็นโปรแกรมเมอร์เราควรคิดว่า shift คือ shift-left และ unshift คือ shift-right บนอาร์เรย์แนวนอนจากซ้ายไปขวา
mckenzm

8

มันคว้าองค์ประกอบแรกลบออกจากอาร์เรย์และส่งคืนองค์ประกอบที่ถูกลบ โดยพื้นฐานแล้วเป็นวิธีการจัดการอาร์เรย์เหมือนสแต็ก: shiftป๊อปunshiftคือพุช


8
shift และ unshift นั้นคล้ายกับ pop and push ยกเว้นว่าจะเพิ่มและลบสิ่งต่างๆจากจุดเริ่มต้นของอาร์เรย์แทนที่จะเป็นจุดสิ้นสุด
Alberto Santini

2
คำตอบนี้อยู่ในระดับนามธรรมที่ถูกต้อง
Steven Sudit

@Alberto: หรือกล่าวอีกนัยหนึ่งพวกเขาคิดว่าด้านหน้าเป็นด้านบน ไม่มีข้อกำหนดให้เป็นอย่างอื่น
Steven Sudit

5
ฉันแค่ชี้ให้เห็นว่าเนื่องจากpopและpushเป็นArrayวิธีการที่ไม่ควรสร้างความสับสน :-)
Alberto Santini

3
@Alberto: นั่นเป็นจุดที่ดีจริงๆ วิธี shift / unshift ใช้ front เป็นด้านบนในขณะที่วิธี push / pop ใช้ end เป็นด้านบน ทั้งคู่ถือว่าอาร์เรย์เป็นสแต็กแตกต่างกันที่จุดสิ้นสุดที่ใช้เท่านั้น
Steven Sudit

2

หากคุณสามารถคิดว่าอาร์เรย์เป็นเหมือนคิวของค่าที่ต้องประมวลผลคุณสามารถใช้ค่าถัดไป (ด้านหน้า) และ "กะ" มูลค่าอื่น ๆ เพื่อครอบครองพื้นที่ว่างที่มีอยู่ การ unshift ทำให้ค่ากลับเข้ามา - บางทีคุณอาจยังไม่พร้อมที่จะประมวลผลบางส่วนหรือปล่อยให้โค้ดบางส่วนจัดการในภายหลัง


1

มันส่งคืนองค์ประกอบแรกของอาร์เรย์และลบออกจากอาร์เรย์โดยเลื่อนองค์ประกอบกลับที่เดียว

ดังนั้นการขยับ [1,2,3,4,5]

ผลตอบแทนและชุดอาร์เรย์จะเป็น1[2,3,4,5]

เพิ่มเติมที่นี่ .

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.