如果我从连续的日期序列开始:
(Date.today..(Date.today + 30)).to_a
如何对此数组进行排序,使所有日期按顺序至少相隔1天?
我意识到这对于2个连续日期的数组当然是不可能的。
答案 0 :(得分:2)
这对我有用:
dates = (Date.today..(Date.today + 30)).to_a
dates.each_with_index{|d,i| dates.push(dates.delete(d)) if i % 2}
答案 1 :(得分:2)
阵列的长度是否均匀?是这样,我只是写(如果需要,可以很容易地修改为奇数长度):
>> (1..6).each_slice(2).to_a.transpose.flatten(1)
=> [1, 3, 5, 2, 4, 6]
答案 2 :(得分:2)
(1..6).partition(&:odd?).flatten #=>[1, 3, 5, 2, 4, 6]
无论偶数或奇数元素如何,都可以使用范围(或任何可枚举的数据)。
答案 3 :(得分:-1)
愚蠢的解决方案:
dates = (Date.today..(Date.today + 30)).to_a
begin
ary = dates.shuffle
valid = (ary.select.each_with_index { |element, i|
( i == ary.length-1 || (ary[i+1] - element).abs > 1 ) &&
( i == 0 || (element - ary[i-1]).abs > 1 )
})
end until valid.length == dates.length
ary
只有在你不太关心表现时才使用; - )