Ruby on rails 围绕键整数对整数数组重新排序
我有多达7个整数代表一周中的每一天Ruby on rails 围绕键整数对整数数组重新排序,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有多达7个整数代表一周中的每一天0。。。6(太阳-卫星) 当天=3(星期三) 如何对整数数组重新排序,使最接近星期三(3)的数字排在第一位 例如: Current Day = 3 Days (input) = [0, 1, 2, 3, 4, 5, 6] Correct Output = [3, 4, 5, 6, 0, 1, 2] 但数组可能不包含所有日期(例如,当前日期可能缺失): 基本上对数组进行重新排序,使当天的排在前面(或前面的整数) 当前尝试:我已经研究过如何使用,但是如果当前日期不
0。。。6
(太阳-卫星)
当天=3
(星期三)
如何对整数数组重新排序,使最接近星期三(3
)的数字排在第一位
例如:
Current Day = 3
Days (input) = [0, 1, 2, 3, 4, 5, 6]
Correct Output = [3, 4, 5, 6, 0, 1, 2]
但数组可能不包含所有日期(例如,当前日期
可能缺失):
基本上对数组进行重新排序,使当天的排在前面(或前面的整数)
当前尝试:我已经研究过如何使用,但是如果当前日期
不在数组中,我不确定如何处理
我还尝试使用minu by
,但它不循环整数
@days.min_by { |x| (x.to_f - Time.now.wday).abs }
如果数组中不包含整数本身,则只需查找输入当天之前整数的索引。在这里:
def mrotate(days, c_day)
index = days.index(c_day)
index = days.index(days.find { |d| d > c_day}) if !index
days.rotate index || 0
end
mrotate([0, 1, 2, 3, 4, 5, 6], 3)
#=> [3, 4, 5, 6, 0, 1, 2]
mrotate([0, 2, 4, 6], 3)
#=> [4, 6, 0, 2]
您可以搜索>=3的第一个索引,并将数组拆分为两个:
x = [0, 1, 2, 3, 4, 5, 6]
y = [0, 2, 4, 6]
pos = x.index{|s| s >= 3}
# => 3
x[pos..-1] + x[0..pos-1]
# [3, 4, 5, 6, 0, 1, 2]
pos = y.index{|s| s >= 3}
# => 2
y[pos..-1] + y[0..pos-1]
# => [4, 6, 0, 2]
如果您正在查找当天之后的日期:
my_array.sort_by{|x| (x-current_day)%7}
如果您只需要查找第一个数字,只需使用min\u by
而不是sort\u by
根据您的输入:
irb(main):059:0* my_array = [0, 1, 2, 3, 4, 5, 6]
=> [0, 1, 2, 3, 4, 5, 6]
irb(main):060:0> current_day = 3
=> 3
irb(main):061:0> my_array.sort_by{|x| (x-current_day)%7}
=> [3, 4, 5, 6, 0, 1, 2]
irb(main):062:0> my_array = [0, 2, 4, 6]
=> [0, 2, 4, 6]
irb(main):063:0> my_array.sort_by{|x| (x-current_day)%7}
=> [4, 6, 0, 2]
看见使用.include?
检查Ruby中的数组是否包含某个值您可以定义“最接近星期三”吗?为什么第二个示例的结果以4
开始,而不是以2
开始?@Stefan对不起,我指的是当前日期之前最近的一天。基本上,是一周中最接近的第二天。您当前的一天,即星期三(3)之前是星期二(2),而不是星期四(4),您可以通过rotate
the array bypos
rotate修改原始数组。不确定这里是否需要这个。rotate
修改数组,rotate
在第days行返回一个新数组。rotate index
我得到错误:没有从nil到integer的隐式转换。即使days是一个有效数组,例如:`[0,1,2]`也要考虑边旋转边…
。假设days
是有序的,就像示例中的快速问题:我如何修改它,使其对数组重新排序,使数组始终从一周的第二天开始,而当前日期始终是最后一天,那么您拥有的比排序更有效。我尝试将+1
添加到当前日期:我的_数组。按{x |(x-current_day+1)%7}排序
但是如果当天是星期六,则当前日期变为8
,这很好。模运算符将正常工作,只需注意它的负1和非正:my_数组。按{x |(x-current_day-1)%7}排序
谢谢。但是我应该使用+1
从第二天开始对数组重新排序,对吗?你的评论使用了-1
。如果你希望第二天是第一天,那么你应该使用x-(当前日+1)
,这就像x-current\u-day-1
(除非我遗漏了什么)
irb(main):059:0* my_array = [0, 1, 2, 3, 4, 5, 6]
=> [0, 1, 2, 3, 4, 5, 6]
irb(main):060:0> current_day = 3
=> 3
irb(main):061:0> my_array.sort_by{|x| (x-current_day)%7}
=> [3, 4, 5, 6, 0, 1, 2]
irb(main):062:0> my_array = [0, 2, 4, 6]
=> [0, 2, 4, 6]
irb(main):063:0> my_array.sort_by{|x| (x-current_day)%7}
=> [4, 6, 0, 2]