Ruby on rails 如何按升序对ruby数组排序,但最后保持零
我试图用以下函数对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,我希望它们显示在最后,而不是顶部 我已经尝试了一些方法,但是我想用一些方法来修改这个块,使其在底部排序为零,但将其余的按升序排序 谢谢。试试这个,我想它正在按照你的要求做
@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
进行比较。您的代码将导致参数错误:将数组与数组进行比较失败
。