Ruby/Rails数组两个索引之间的所有元素

6
我有一个像这样的数组:[7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6]。如何以最简单的方式从位置6返回数组中的每个项直到0,结果数组看起来像这样:[1,2,3,4,5,6,7]。这个数组中的位置可以是动态的,例如传入4和9应该返回[11,12,1,2,3,4]。我想知道在Rails api中是否有实现此功能的方法。谢谢提前!
编辑 假设没有负数,因此不会使用array[2..-2]。虽然Array#splice几乎可以实现这个功能,但如果第二个位置小于第一个位置,则返回nil

2
你为此尝试了什么? - Arslan Ali
http://ruby-doc.org/core-2.2.0/Array.html - xlembouras
1
你可以执行a = [7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6],然后a[4..9] => [11,12,1,2,3,4]。 - Gaurav Gupta
“until 0” 是什么意思? - sawa
@sawa 0 是数组中的第一项。 - splitter_in_the_sun
7个回答

4
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]

我想有人会使用 rotate - Cary Swoveland

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

然后。
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]

如果您不想进行猴子补丁操作,您可以使用以下方法:
您可以编写一个类似于以下代码的方法:
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]

如果你要猴子补丁一个核心对象,至少要把命名搞对 Array#get_sub_array。https://github.com/bbatsov/ruby-style-guide - max
谢谢。我来自C#背景。快速打字不知不觉犯了错误 :) - BinaryMee
1
Ruby的命名相比PHP、JavaScript等其他编程语言实际上非常简单易懂——除了一些特殊情况,例如类/模块名或实际的常量,所有的命名都应采用蛇形命名法。 - max
为什么要使用<<flatten而不是array[start..-1] + array[0..last] - John La Rooy
1
更新了!感谢 @JohnLaRooy。 - BinaryMee

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

您可以使用三元运算符使其成为一行代码:

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]

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
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

还有几种方式(我更喜欢第一种)。

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]

-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]

哦,他想要从最后一项回到第一项。我不认为它让你这样做。 - cubsker
如果你真的知道位置,那么你可以执行myArraya[6..11].to_a << a[0]来得到[1,2,3,4,5,6,7]。 - cubsker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接