Arrays Ruby排序偶数和奇数问题

Arrays Ruby排序偶数和奇数问题,arrays,ruby,sorting,if-statement,Arrays,Ruby,Sorting,If Statement,我正在学习Ruby,刚刚开始排序。尝试像这样对数组进行排序:[1,3,5,2,4,6],我真的不明白代码有什么问题。任何帮助都将不胜感激 [1,2,3,4,5,6].sort do |x,y| if x.odd? and y.odd? 0 elsif x.odd? -1 else 1 end if (x.odd? && y.odd?) or (x.even? && y.even?) x <=> y en

我正在学习Ruby,刚刚开始排序。尝试像这样对数组进行排序:[1,3,5,2,4,6],我真的不明白代码有什么问题。任何帮助都将不胜感激

[1,2,3,4,5,6].sort do |x,y|
  if x.odd? and y.odd?
    0
  elsif x.odd?
    -1
  else
     1
end  
  if (x.odd? && y.odd?) or (x.even? && y.even?)
  x <=> y
end 
end

首先,让我们修复缩进并转换为标准Ruby社区编码风格,以便更好地了解发生了什么:

[1, 2, 3, 4, 5, 6].sort do |x, y|
  if x.odd? && y.odd?
    0
  elsif x.odd?
    -1
  else
     1
  end

  if (x.odd? && y.odd?) || (x.even? && y.even?)
    x <=> y
  end 
end
对于两个相等的元素,它将返回0;对于两个不相等但都是奇数或偶数的元素,它将返回1或1;而要排序的nil意味着这两个元素是不可比较的,对于一个元素是奇数,一个元素是偶数的元素,它们没有定义的相对顺序。由于排序要求所有元素都具有可比性,因此它将中止

解决此问题的最简单方法可能是将数组划分为赔率和偶数,分别对它们进行排序,然后将它们连接起来:

[1, 2, 3, 4, 5, 6].partition(&:odd?).map(&:sort).inject(:concat)
#=> [1, 3, 5, 2, 4, 6]
或者反过来做,将它们全部排序,然后进行分区:


这可能是我第一次用负片:

如果我是奇数,那么i%-2就是-1 如果i为偶数,则i%-2为0 因此,首先按i%-2排序,然后按i排序,应该可以达到预期的结果

如果您希望奇数之前有偶数,可以按i%2排序


感谢@Stefan的原创创意

漂亮的一行。您甚至可以通过先排序然后分区来删除映射:[3,2,1,5,6,4]。排序。分区&:odd?.inject:concatOr[1,2,3,4,5,6]。按{i.odd±0:1,i]}排序。有人能解释一下吗?0:1部分代码给我?很高兴知道有一个负模的应用:-D
[1, 2, 3, 4, 5, 6].partition(&:odd?).map(&:sort).inject(:concat)
#=> [1, 3, 5, 2, 4, 6]
[1, 2, 3, 4, 5, 6].sort.partition(&:odd?).inject(:concat)
#=> [1, 3, 5, 2, 4, 6]
[3, 2, 1, 5, 6, 4].sort_by{ |i| [ i % -2, i] }
#=> [1, 3, 5, 2, 4, 6]