假设我有一系列随机数,没有特定的顺序。让我们说这些是在马拉松比赛中跑步的人的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
非常感谢!
答案 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/