Ruby: วิธีที่ง่ายที่สุดในการลบองค์ประกอบแรกออกจากอาร์เรย์คืออะไร?


257

ให้บอกว่าฉันมีอาร์เรย์

[0, 132, 432, 342, 234]

วิธีที่ง่ายที่สุดในการกำจัดองค์ประกอบแรกคืออะไร (0)


1
'shift' เป็น pop และ 'unshift' เป็น push การเปลี่ยนแปลงใดที่ใช้จำนวนพารามิเตอร์ที่จะปรากฏ
Arun

คำตอบ:


287

"pop" ในองค์ประกอบแรกของ Array เรียกว่า " shift " ("unshift" เป็นการดำเนินการของการเพิ่มองค์ประกอบหนึ่งที่ด้านหน้าของอาร์เรย์)


11
หมายเหตุสิ่งนี้จะทำการปิดอาร์เรย์และส่งคืนnilอาร์เรย์ที่ว่าง ดูdropทางเลือกอื่นดังที่ได้กล่าวไว้ในคำตอบอื่น
Jay

368
a = [0,1,2,3]

a.drop(1)
# => [1, 2, 3] 

a
# => [0,1,2,3]

และนอกจากนี้:

[0,1,2,3].drop(2)
=> [2, 3]

[0,1,2,3].drop(3)
=> [3] 

15
คำตอบที่ดีที่สุดเนื่องจาก (a) ประเมินค่าอาร์เรย์ที่ถูกตัดและมันทำงานได้ตามที่คาดไว้ในอาร์เรย์ที่ว่างเปล่า:[].drop(1) => []
fearless_fool

4
ยังเป็นคำตอบที่ดีที่สุดเพราะ OP กล่าวว่า "วิธีที่ง่ายที่สุดในการกำจัดองค์ประกอบแรก"
อะไร

4
คำตอบนี้แสดงให้เห็นว่ามันจะแนะนำให้เลื่อนลงแม้ว่าคำตอบแรกและข้อยกเว้นมีมากกว่า 100 upvotes แล้ว ขอบคุณ.
maddin2code

7
+1 เนื่องจากสิ่งนี้จะคืนค่าอาเรย์ที่ถูกแก้ไขในขณะshiftที่อาเรย์จะถูกแทนที่และส่งคืนองค์ประกอบที่ถูกเลื่อน (หรือnilถ้าอาเรย์นั้นว่างเปล่า)
yuval

305

ใช้shiftวิธีการในอาร์เรย์

>> x = [4,5,6]
=> [4, 5, 6]                                                            
>> x.shift 
=> 4
>> x                                                                    
=> [5, 6] 

หากคุณต้องการลบองค์ประกอบเริ่มต้น n คุณสามารถใช้ x.shift(n)


3
คำอธิบายควรรวมเข้ากับคำตอบที่ถูกต้องเนื่องจากเนื้อหาเหมือนกัน
Yolgie

129
[0, 132, 432, 342, 234][1..-1]
=> [132, 432, 342, 234]

ซึ่งแตกต่างจากนี้shiftหรือsliceคืนค่าอาเรย์ที่ถูกแก้ไข (มีประโยชน์สำหรับหนึ่ง liners)


12
หนึ่ง gotcha ระวัง: ถ้าอาร์เรย์ว่างก็จะส่งกลับศูนย์: ไม่[][1..-1] => nil []
Mohamad

2
ไม่ใช่[1,2,3].shiftสายการบินเดียวหรือ
thekingoftruth

4
@ thekingoftruth: ใช่ แต่ประเมินไปยังองค์ประกอบที่คุณโยนออกไปไม่ใช่ส่วนที่เหลือของอาร์เรย์ดังนั้นจึงต้องใช้อีกบรรทัดหนึ่ง
fearless_fool

4
ผมชอบคำตอบนี้เพราะมันเป็นหนึ่งในสายการแสดงออกที่คุณสามารถใช้ที่ใดก็ได้ เพื่อหลีกเลี่ยงการ [] VS arry[1..-1] || []ปัญหาศูนย์ที่คุณสามารถทำได้ แต่ arry.drop (1) นั้นดีกว่า
fearless_fool

ฉันจะไปกับเพราะว่ามันเรียบง่ายคุณจะได้รับ "อาร์เรย์ลบสิ่งที่เลื่อนออกไป" ได้อย่างไรฉันไม่เห็นว่ามันจะทำงานอย่างไร ... มันเป็นคำตอบหลัก แต่ดูเหมือนจะไม่ตอบ คำถามตั้งแต่ขั้นตอนต่อไปนี้ไม่ชัดเจนสำหรับมือใหม่!
Louis Maddox

99

นี่ค่อนข้างเรียบร้อย:

head, *tail = [1, 2, 3, 4, 5]
#==> head = 1, tail = [2, 3, 4, 5]

ตามที่เขียนไว้ในความคิดเห็นมีข้อได้เปรียบของการไม่กลายพันธุ์รายการเดิม


2
ฉลาดมากและทำงานได้อย่างสมบูรณ์แบบ เมื่อคุณทำเช่นนี้คุณจะมีทั้งตัวแปร "หัว" และ "หาง" ตามที่คุณต้องการ
nfriend21

3
สิ่งนี้ทำให้ฉันกระเพื่อมมาก (let ((head (car mylist)) (tail (cdr mylist)) ...)
thekingoftruth

@ hurikhan77 ดีมาก! ฉันตั้งใจจะลองทำดู การรู้ว่า Darcs เขียนใน Haskell ช่วยให้ความสนใจของฉันงง
thekingoftruth

6
รุ่นนี้ยังมีข้อได้เปรียบในการไม่เปลี่ยนแปลงรายการดั้งเดิม
Paweł Obrok

2
มีประโยชน์เมื่อทำการแยกข้อมูลโดยไม่มีขั้นตอนเพิ่มเติม header, *properties = CSV.read(file_path,encoding: 'ISO-8859-1')
juliangonzalez




4

คุณสามารถใช้วิธี Array.delete_at (0) ซึ่งจะลบองค์ประกอบแรก

 x = [2,3,4,11,0]
 x.delete_at(0) unless x.empty? # [3,4,11,0]

ฉันไม่คิดว่าunless x.empty?จำเป็น มันก็จะส่งกลับnilถ้าดัชนีอยู่นอกช่วง
tknomad

2

คุณสามารถใช้ได้:

 a.delete(a[0])   
 a.delete_at 0

ทั้งสองสามารถทำงานได้


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