ruby / rails数组两个索引之间的所有元素

时间:2015-06-19 05:33:03

标签: ruby-on-rails arrays ruby

我有一个这样的数组:[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中实现这一点。

提前致谢

EDIT 我们假设没有负数,所以做array[2..-2]不会有用。

Array#splice几乎适用于此,但如果第二个位置小于第一个位置,则返回nil

7 个答案:

答案 0 :(得分: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]

答案 1 :(得分: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]

答案 2 :(得分:1)

Picasso.with(getApplicationContext())
            .load(Pref.getValue(getApplicationContext(),
                    Const.PREF_PROFILE_PIC, "")).into(iv_profile);

    Picasso.with(getApplicationContext())
            .load(Pref.getValue(getApplicationContext(),
                    Const.PREF_COVER_PIC, "")).into(iv_cover);

您也可以使用三元运算符使其成为一个衬垫:

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

答案 3 :(得分: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

答案 4 :(得分:0)

var date = new Date(response*1000);

答案 5 :(得分:0)

还有更多方法(我倾向于#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]

答案 6 :(得分:-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]