繁体   English   中英

Ruby排序偶数和奇数问题

[英]Ruby sorting even and odd numbers issue

我正在学习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-11 ,但是使用此值不执行任何操作 该值不存储在变量中,不作为参数传递,不返回。 它只是被忽略。 整个表达式是NO-OP。

这意味着唯一重要的是:

  if (x.odd? && y.odd?) || (x.even? && y.even?)
    x <=> y
  end 

这将返回0两个元素是相等的, -11为两个元件是不相等的,但两者的奇数或偶数,和nil (其以sort单元“这两个元件都非可比性,它们不具有一定义相对顺序”),其中一个元素为奇数,一个元素为偶数。 由于sort要求所有元素都具有可比性,因此它将中止。

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

[1, 2, 3, 4, 5, 6].partition(&:odd?).map(&:sort).inject(:concat)
#=> [1, 3, 5, 2, 4, 6]

或者反过来做,将它们全部排序, 然后分区( 谢谢@Eric Duminil ):

[1, 2, 3, 4, 5, 6].sort.partition(&:odd?).inject(:concat)
#=> [1, 3, 5, 2, 4, 6]

这可能是我第一次使用负

  • 如果i是奇数, i % -2-1
  • 如果i是偶数, i % -20

因此,先按i % -2排序,然后再按i排序即可达到理想的结果。

如果要在奇数之前输入偶数,则可以按i % 2进行排序。


[3, 2, 1, 5, 6, 4].sort_by{ |i| [ i % -2, i] }
#=> [1, 3, 5, 2, 4, 6]

感谢@Stefan的初衷!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM