Ruby: Cách dễ nhất để loại bỏ phần tử đầu tiên khỏi một mảng là gì?


257

Hãy nói rằng tôi có một mảng

[0, 132, 432, 342, 234]

Cách dễ nhất để thoát khỏi yếu tố đầu tiên là gì? (0)


1
'shift' là pop và 'unshift' là đẩy. Trong đó sự thay đổi sẽ lấy số lượng tham số để bật
Arun

Câu trả lời:


287

"pop" ing phần tử đầu tiên của Mảng được gọi là " shift " ("unshift" là hoạt động thêm một phần tử phía trước mảng).


11
Lưu ý điều này làm thay đổi mảng và trả nilvề một mảng trống. Xem dropcho một sự thay thế, như được đề cập trong câu trả lời khác.
Jay

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

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

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

và bổ sung:

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

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

15
Câu trả lời hay nhất vì (a) ước tính cho mảng được cắt xén và nó hoạt động như mong đợi trên một mảng trống:[].drop(1) => []
sợless_fool

4
Đây cũng là câu trả lời hay nhất vì OP đã nói "cách dễ nhất để loại bỏ yếu tố đầu tiên"
notaceo

4
Câu trả lời này cho thấy rằng nên cuộn xuống ngay cả khi câu trả lời đầu tiên và bị loại trừ đã có hơn 100 lượt tải. Cảm ơn bạn.
maddin2code

7
+1 vì điều này trả về một mảng đã sửa đổi, trong khi đó làm thay shiftđổi mảng tại chỗ và trả về phần tử đã dịch (hoặc nilnếu mảng trống)
yuval

305

Sử dụng shiftphương thức trên mảng

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

Nếu bạn muốn loại bỏ n phần tử bắt đầu, bạn có thể sử dụng x.shift(n)


3
lời giải thích nên được hợp nhất vào câu trả lời đúng vì nội dung giống nhau
Yolgie

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

Vì vậy, không giống shifthoặc sliceđiều này trả về mảng đã sửa đổi (hữu ích cho một lớp lót).


12
Một gotcha để coi chừng: nếu mảng trống, nó trả về nil: [][1..-1] => nilvà không [].
Mohamad

2
Không phải [1,2,3].shiftlà một lót?
thekingoftruth

4
@thekingoftruth: có, nhưng nó đánh giá thành phần bạn đã ném đi, không phải phần còn lại của mảng, vì vậy nó cần một dòng khác.
sợ hãi_fool

4
Tôi thích câu trả lời này vì đó là biểu thức một dòng mà bạn có thể sử dụng ở bất cứ đâu. Để tránh vấn đề [] vs nil, bạn có thể làm arry[1..-1] || []. Nhưng arry.drop (1) thậm chí còn tốt hơn.
sợ hãi_fool

Tôi đang làm điều này thật đơn giản, làm thế nào bạn có được "mảng trừ đi những gì đã bị loại bỏ", tôi không thể thấy nó hoạt động như thế nào ... Đó là câu trả lời chính nhưng dường như không trả lời câu hỏi vì bước tiếp theo này không rõ ràng đối với người mới!
Louis Maddox

99

Điều này là khá gọn gàng:

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

Như đã viết trong các bình luận, có một lợi thế là không làm thay đổi danh sách ban đầu.


2
rất thông minh, và làm việc hoàn hảo. Khi bạn thực hiện việc này, bạn sẽ có cả hai biến "đầu" và "đuôi" theo ý của bạn.
nfriend21 18/07/13

3
Điều này nhắc nhở tôi rất nhiều lisp. (let ((head (car mylist)) (tail (cdr mylist)) ...)
thekingoftruth

@ Hurikhan77 Đẹp quá! Tôi đã có ý định thử nó. Biết rằng Darcs được viết bằng Haskell giúp khơi gợi sự quan tâm của tôi.
thekingoftruth

6
Phiên bản này cũng có lợi thế là không làm thay đổi danh sách ban đầu
Paweł Obrok 17/03/2016

2
hữu ích khi trích xuất thông tin mà không cần bước quảng cáo header, *properties = CSV.read(file_path,encoding: 'ISO-8859-1')
juliangonzalez




4

Bạn có thể sử dụng phương thức Array.delete_at (0) sẽ xóa phần tử đầu tiên.

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

Tôi không nghĩ unless x.empty?là cần thiết. Nó chỉ đơn giản là trả về nilnếu chỉ mục nằm ngoài phạm vi.
tknomad

2

Bạn có thể dùng:

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

Cả hai đều có thể làm việc


1

Bạn có thể sử dụng:
arr - [arr[0]] hoặc cách khác arr - [arr.shift()] hoặc đơn giản arr.shift(1)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.