重新排序关键整数周围的整数数组

时间:2015-10-23 11:20:22

标签: ruby-on-rails ruby

我最多有7个整数代表一周中的每一天0 ... 6(太阳 - 坐着)

current day = 3(周三)。

如何重新排序整数数组,以便最接近星期三(3)的数字出现。

例如:

Current Day = 3
Days (input) = [0, 1, 2, 3, 4, 5, 6]
Correct Output = [3, 4, 5, 6, 0, 1, 2]

但是数组可能不包含所有日期(例如current day可能会丢失):

Current Day = 3
Days (input) = [0, 2, 4, 6]
Correct Output = [4, 6, 0, 2]

基本上对数组进行重新排序,使current day成为第一个(或者在它之前的整数)

当前尝试:我已尝试使用a.rotate,但如果current day不在数组中,我不确定如何处理。

我也尝试过使用min_by,但它不会循环整数

@days.min_by { |x| (x.to_f - Time.now.wday).abs } 

3 个答案:

答案 0 :(得分:2)

如果您正在寻找当天之后的日子:

my_array.sort_by{|x| (x-current_day)%7}

如果您要查找的只是第一个号码,只需使用min_by代替sort_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]

答案 1 :(得分:1)

您需要做的就是找到输入当前日之前的整数索引(如果它本身未包含在数组中)。这里:

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]

答案 2 :(得分:0)

您可以搜索第一个>= 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]