Ruby on rails 围绕键整数对整数数组重新排序

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] 但数组可能不包含所有日期(例如,当前日期可能缺失): 基本上对数组进行重新排序,使当天的排在前面(或前面的整数) 当前尝试:我已经研究过如何使用,但是如果当前日期不

我有多达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]
但数组可能不包含所有日期(例如,
当前日期
可能缺失):

基本上对数组进行重新排序,使
当天的
排在前面(或前面的整数)

当前尝试:我已经研究过如何使用,但是如果
当前日期
不在数组中,我不确定如何处理

我还尝试使用
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 by
pos
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]