2015-06-19 14 views
5

Tôi có một mảng như thế này: [7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6]ruby ​​/ ray mảng tất cả các yếu tố giữa hai chỉ số

gì là cách đơn giản nhất để trở lại từng hạng mục trong mảng từ vị trí 6 đến 0 nơi các mảng kết quả trông giống như: [1,2,3,4,5,6,7]

Vị trí này trong mảng có thể là động, ví dụ: đi qua trong 4 và 9 phải trả về [11,12,1,2,3,4]

Tôi tự hỏi liệu có phương pháp nào hoàn thành điều này trong api Rails hay không.

Cảm ơn trước

EDIT Giả sử rằng không có số âm, vì vậy làm array[2..-2] wont work.

Array#splice hầu như hoạt động cho điều này, nhưng nếu vị trí thứ hai nhỏ hơn vị trí thứ nhất, nó trả về nil.

+2

bạn đã thử làm gì cho nó? –

+0

http://ruby-doc.org/core-2.2.0/Array.html – xlembouras

+1

bạn có thể thực hiện a = [7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6 ] và [4..9] => [11,12,1,2,3,4] –

Trả lời

2
class Array 
    def get_sub_array(start,last) 
     (start > last) ? (self[start..-1] + self[0..last]) : self[start..last] 
    end 
end 

Sau đó

a = [7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6] 
a.get_sub_array(6,0) 
#[1, 2, 3, 4, 5, 6, 7] 

Hoặc nếu bạn không muốn con khỉ vá

Bạn có thể có một phương pháp như

def get_sub_array(array, start,last) 
    (start > last) ? (array[start..-1] + array[0..last]) : array[start..last] 
end 

a = [7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6] 
get_sub_array(a,6,0) 
#[1, 2, 3, 4, 5, 6, 7] 
+0

Nếu bạn đang đi đến khỉ vá một đối tượng cốt lõi ít ​​nhất có được đặt tên đúng 'mảng # get_sub_array'. https://github.com/bbatsov/ruby-style-guide – max

+0

Cảm ơn bạn. Tôi đến từ nền C#.Các ngón tay nhanh đã sai lầm vô tình :) – BinaryMee

+1

Đặt tên Ruby thực sự chết đơn giản so với PHP, javascript v.v. - mọi thứ phải là snake_case trừ khi nó là một dạng không đổi như Class/ModuleName hoặc CONSTANT thực. – max

-1
myArray = [7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6] 
myArray[6..-1] returns [1, 2, 3, 4, 5, 6] 
myArray[4..9] returns [11,12,1,2,3,4] 
+0

oh, anh ấy muốn đi qua mục cuối cùng quay lại mục đầu tiên. đừng nghĩ rằng nó cho phép bạn làm điều đó. – cubsker

+0

nếu bạn thực sự biết vị trí thì bạn có thể làm myArraya [6..11] .to_a << a [0] để nhận [1,2,3,4,5,6,7] – cubsker

0
min=6 
max=0 
arr = [7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6] 
result = [] 
if max<min 
    result << arr[min..arr.length] 
    result << arr[0..max] 
else 
    result << arr[min..max] 
end 
+0

Điều này sẽ không hoạt động? –

1
def some_function(some_array,start_val=6, end_val=0) 
    if end_val > start_val 
    some_array[start_val,(end_val - start_val)] 
    else 
    (some_array[start_val, some_array.size] << some_array[0, (end_val)]).flatten 
    end 
end 

Bạn có thể sử dụng toán tử ternary để làm cho nó trở thành một lót quá:

def some_function(some_array,start_val=6, end_val=0) 
    end_val > start_val ? some_array[start_val,(end_val - start_val)] : (some_array[start_val, some_array.size] << some_array[0, (end_val)]).flatten 
end 

a = [7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6] 
some_function(a) # => [1, 2, 3, 4, 5, 6, 7] 
some_function(a, 4, 9) # => [11, 12, 1, 2, 3, 4] 
3
def foo a, min, max 
    a.rotate(min).first((max - min) % a.length + 1) 
end 

a = [7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6] 
foo(a, 6, 0) # => [1, 2, 3, 4, 5, 6, 7] 
foo(a, 4, 9) # => [11, 12, 1, 2, 3, 4] 
+0

Tôi đã tìm ra ai đó đã thực hiện 'xoay vòng'. –

0
def foo a, s, e 
    a = e < s ? (a[s,a.size] << a[0..e]).flatten : a[s..e] 
end 

a = [7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6] 
a = foo(a, 6, 0) # => [1, 2, 3, 4, 5, 6, 7] 
a = foo(a, 4, 9) # => [11, 12, 1, 2, 3, 4] 
0

Một vài chi tiết cách (sở thích của tôi là cho # 1).

a = [7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6] 

# 1

def foo a, min, max 
    as = a.size 
    max += as if max < min 
    (min..max).map { |i| a[i%as] } 
end 

foo(a, 6, 0) # => [ 1, 2, 3, 4, 5, 6, 7] 
foo(a, 4, 9) # => [11, 12, 1, 2, 3, 4] 

# 2

def foo a, min, max 
    max += a.size if max < min 
    e = a.cycle 
    min.times { e.next } 
    (max-min+1).times.map { e.next } 
end 

foo(a, 6, 0) # => [ 1, 2, 3, 4, 5, 6, 7] 
foo(a, 4, 9) # => [11, 12, 1, 2, 3, 4] 
Các vấn đề liên quan