Ruby:数组,循环数组,数组位置中的next / previous值

时间:2011-03-28 19:41:19

标签: ruby arrays

假设我有一系列随机数,没有特定的顺序。让我们说这些是在马拉松比赛中跑步的人的ID#,他们按照他们完成的顺序添加到阵列中,如:

race1 = [8, 102, 67, 58, 91, 16, 27]
race2 = [51, 31, 7, 15, 99, 58, 22]

这是一个简化且有点人为的例子,但我认为它传达了基本的想法。

现在有几个问题:

首先,我如何获得特定条目之前和之后的ID?让我们说我正在看第58跑,我想知道谁在他之前和之后完成了。

race1, runner58: previous finisher=67, next finisher=91
race2, runner58: previous finisher=99, next finisher=22

其次,如果我正在看第一个或最后一个完成的人,我怎么能在阵列周围回到“下一个”或“前一个”?

race1, runner8: previous finisher=27, next finisher=102
race2, runner22: previous finisher=58, next finisher=51

最后,我想展示每个跑步者完成的位置。只考虑数组及其中的值,我怎样才能找出它在数组中的“序数”位置?即:

race1: runner8=1st, runner102=2nd, runner67=3rd ... runner27=last

非常感谢!

5 个答案:

答案 0 :(得分:7)

第一&第二:

index = race1.find_index(58)
if !index.nil?
  puts "#{race1[index-1], #{race1[index+1] || race1[0]}"
end

<强>最后:

  

gem install语言学

然后

require 'linguistics'
Linguistics::use( :en )
race1.each_with_index {|runner, i| puts "runner#{runner}=#{(i+1).en.ordinal}"}

答案 1 :(得分:5)

对于项目#1和#2,我将创建一个方法,通过id返回前一个和下一个元素,自动换行为第一个和最后一个,例如:

class Array
  def prev_next(id)
    idx = self.index(id)
    raise Error.new("no racer with id #{id}") unless idx
    [self[idx-1], self[(idx+1)%self.size]]
  end
end
race1.prev_next(58) # => [67, 91]
race1.prev_next(8) # => [27, 102]

请注意,唯一可能的负指数-1实际上归结为Ruby array.slice,并且通过使用数组大小​​的模数,我们可以调整包装结束。对于第三项,ordinalization可以这样完成:

class Integer
  def ordinalize
    s = self.to_s
    case s
      when /1[123]$/ then s + 'th'
      when /1$/ then s + 'st'
      when /2$/ then s + 'nd'
      when /3$/ then s + 'rd'
      else s + 'th'
    end
  end
end
race1.each_with_index {|x,i| puts "runner#{x}=#{(i+1).ordinalize}"}
# runner8=1st
# runner102=2nd
# runner67=3rd
# ...

答案 2 :(得分:2)

find_index方法可能是您最好的选择。

runner_index = race.find_index finisher_number #find the index of the racer
previous_runner = race[runner_index - 1] #a negative index will wrap around
next_runner = race[runner_index + 1] || race[0] #use a null guard to wrap to the front

答案 3 :(得分:0)

你好我不知道你想要做什么但是如果你使用ruby 1.9你应该看看rotate方法,如果你使用ruby 1.8.7,你应该尝试围绕索引方法构建一些东西 喜欢

race1[race1.index(58) +1] will give 98 (the next one)
race1[race1.index(58) -1] will give 67 (the previous one)

你需要调整一下来模拟旋转(通过测试返回的indice的值与数组的大小相比或者为0)

答案 4 :(得分:0)

第一&amp;第二:

race1.rotate(race1.index(58) + 1).first # next
race1.rotate(race1.index(58) - 1).first # previous

信用:在这篇文章中看到了这个:http://jamonholmgren.com/rubymotion-react-pattern/