2009-03-29 36 views

Trả lời

117

Có, Ruby có cú pháp cắt mảng rất giống với Python. Dưới đây là tài liệu ri cho phương pháp chỉ số mảng:

--------------------------------------------------------------- Array#[] 
    array[index]    -> obj  or nil 
    array[start, length]  -> an_array or nil 
    array[range]    -> an_array or nil 
    array.slice(index)   -> obj  or nil 
    array.slice(start, length) -> an_array or nil 
    array.slice(range)   -> an_array or nil 
------------------------------------------------------------------------ 
    Element Reference---Returns the element at index, or returns a 
    subarray starting at start and continuing for length elements, or 
    returns a subarray specified by range. Negative indices count 
    backward from the end of the array (-1 is the last element). 
    Returns nil if the index (or starting index) are out of range. 

     a = [ "a", "b", "c", "d", "e" ] 
     a[2] + a[0] + a[1] #=> "cab" 
     a[6]     #=> nil 
     a[1, 2]    #=> [ "b", "c" ] 
     a[1..3]    #=> [ "b", "c", "d" ] 
     a[4..7]    #=> [ "e" ] 
     a[6..10]    #=> nil 
     a[-3, 3]    #=> [ "c", "d", "e" ] 
     # special cases 
     a[5]     #=> nil 
     a[5, 1]    #=> [] 
     a[5..10]    #=> [] 
+5

tại sao [5, 1] ​​khác với [6, 1]? – dertoni

+3

@dertoni: http://stackoverflow.com/questions/3219229/why-does-array-slice-behave-differently-for-length-n – michelpm

+8

'a [2 ..- 1]' để lấy từ phần tử thứ 3 đến cái cuối cùng. 'a [2 ...- 1]' để lấy từ phần tử thứ 3 đến phần tử cuối cùng thứ hai. –

15

Bạn có thể sử dụng slice() cho việc này:

>> foo = [1,2,3,4,5,6] 
=> [1, 2, 3, 4, 5, 6] 
>> bar = [10,20,30,40,50,60] 
=> [10, 20, 30, 40, 50, 60] 
>> half = foo.length/2 
=> 3 
>> foobar = foo.slice(0, half) + bar.slice(half, foo.length) 
=> [1, 2, 3, 40, 50, 60] 

Bằng cách này, theo sự hiểu biết của tôi, Python "danh sách" chỉ là thực hiện có hiệu quả các mảng tăng trưởng năng động. Chèn lúc đầu là trong O (n), chèn vào cuối là phân bổ O (1), truy cập ngẫu nhiên là O (1).

+0

Bạn có ý định sử dụng mảng thanh trong lát thứ hai không? – Samuel

+0

Vâng, cảm ơn. Tôi đã sửa lỗi này. – Manuel

+0

FYI: 'slice!()' Không sửa đổi mảng tại chỗ, thay vào đó, nó "Xóa (các) thành phần được đưa ra bởi một chỉ mục (tùy chọn lên đến các phần tử độ dài) hoặc theo một phạm vi." trên http://ruby-doc.org/core-2.2.3/Array.html#method-i-slice-21 –

-5

bạn cũng có thể viết một cái gì đó như thế này

foo = [1,2,3,4,5,6,7] 
bar = [10,20,30,40,50,60,70] 
half = foo.length/2 
foobar = (foo.first half) + (bar.drop half) 

=> [1, 2, 3, 40, 50, 60, 70] 
+1

Bạn làm mất đối tượng ở giữa trong trường hợp mảng có kích thước lẻ. –

+0

điểm duy nhất của tôi là để cho thấy rằng có thể cắt mảng gọi đầu tiên và phương pháp cuối cùng – shabunc

+2

Các tài liệu tham khảo mã không an toàn tiềm năng của @ michael-kohl là quan trọng. Vui lòng sửa đổi để ai đó không sử dụng mã này và bỏ lỡ trường hợp xảy ra 0,5 lần. -1 – ghayes

18

Nếu bạn muốn chia/cắt mảng trên một chỉ số i,

arr = arr.drop(i) 

> arr = [1,2,3,4,5] 
=> [1, 2, 3, 4, 5] 
> arr.drop(2) 
=> [3, 4, 5] 
5

một cách khác là sử dụng phương pháp phạm vi

foo = [1,2,3,4,5,6] 
bar = [10,20,30,40,50,60] 
a = foo[0...3] 
b = bar[3...6] 

print a + b 
=> [1, 2, 3, 40, 50 , 60] 
Các vấn đề liên quan