Ruby on rails 如何按升序对ruby数组排序,但最后保持零

Ruby on rails 如何按升序对ruby数组排序,但最后保持零,ruby-on-rails,ruby,Ruby On Rails,Ruby,我试图用以下函数对Ruby数组进行排序 @prices = @item.prices.sort { |x,y| x.total <=> y.total } @prices=@item.prices.sort{| x,y | x.total y.total} 从最低到最高的订单成本。但是,有些产品的总数为0.00,我希望它们显示在最后,而不是顶部 我已经尝试了一些方法,但是我想用一些方法来修改这个块,使其在底部排序为零,但将其余的按升序排序 谢谢。试试这个,我想它正在按照你的要求做

我试图用以下函数对Ruby数组进行排序

@prices = @item.prices.sort { |x,y| x.total <=> y.total }
@prices=@item.prices.sort{| x,y | x.total y.total}
从最低到最高的订单成本。但是,有些产品的总数为0.00,我希望它们显示在最后,而不是顶部

我已经尝试了一些方法,但是我想用一些方法来修改这个块,使其在底部排序为零,但将其余的按升序排序


谢谢。

试试这个,我想它正在按照你的要求做:

@prices = @item.prices.sort {|a,b| a.total==0 ? 1 : b.total==0 ? -1 : a.total<=>b.total}
@prices=@item.prices.sort{a,b | a.total==0?1:b.total==0?-1:a.totalb.total}

所以设计一个比较器来实现这一点

if x.total == 0
  # always consider 0 "largest" and no 0 can be larger than another
  # (make sure 0.0 is 0 and not a number really close to 0)
  # perhaps x or y should be first for other reasons as well?
  1
else
  # otherwise lower to higher as normal
  x.total <=> y.total
end
如果x.total==0
总是考虑0个“最大”,而0个不能大于另一个。
#(确保0.0为0,并且不是一个真正接近0的数字)
#也许x或y也应该是第一位,因为其他原因?
1.
其他的
#否则按正常从低到高
x、 总计
结束
或无评论:

foo.sort {|x, y| if x.total == 0 then 1 else x.total <=> y.total end}
foo.sort{| x,y |如果x.total==0,那么1 else x.total y.total end}
快乐编码

prices = [0, 1, 2, 0,4, 3]
prices = prices.sort_by do |price|
  [
    if price == 0
      1
    else
      0
    end,
    price
  ]
end
p prices
# => [1, 2, 3, 4, 0, 0]
这里的诀窍是通过比较数组的第一个元素来进行比较,但是如果这些元素相等,则通过比较下一个元素来进行比较,依此类推。因此,使用sort_by块生成一个数组,可以以干净的方式确定主排序顺序、次排序顺序等。

仅用于记录:

>> a = [0, 1, 3, 0, 2, 5, 0, 9]
=> [0, 1, 3, 0, 2, 5, 0, 9]
>> a.sort_by { |x| x.zero? ? Float::MAX : x }
=> [1, 2, 3, 5, 9, 0, 0, 0]
在大多数平台上,
1.0/0
将计算为
无穷大
,因此您也可以使用它来代替
Float::MAX

>> b = [1,4,2,0,5,0]
=> [1, 4, 2, 0, 5, 0]
>> Inf = 1.0/0
=> Infinity
>> b.sort_by { |x| x.zero? ? Inf : x }
=> [1, 2, 4, 5, 0, 0]

这会让人感觉不那么刻薄,也不会只给我写信:

prices = prices.sort_by do |price| 
  zero_status = price.zero? ? 1 : 0
  [zero_status, price]
end

因为这是一种按照两个标准对事物进行排序的惯用方法,这就是你在这里所做的。

如果你喜欢条件运算符和一个绝望的一行式
foo.sort{| x,y | x.total.zero??1:x.total y.total}
这个答案是不正确的。问题是它只检查
x.total==0
,但它还应该检查
y.total==0
,在这种情况下也返回1。否则,对于某些数组,您无法获得所需的结果,例如:
[2,1,0]。排序{{x,y{如果x==0,则1 else x y end}
给出
[0,1,2]
。(注意,为了简单起见,我跳过了
.total
部分,但问题是相同的。)小更正:我应该说“当
y.total==0
时返回-1。因此,更正的答案应该是:
foo.sort{x,y |如果x.total==0,下一个1;如果y.total==0;x.total y.total}
。与下面@ctcherry的答案相同。@aclarke您不能将
false
true
进行比较。您的代码将导致
参数错误:将数组与数组进行比较失败