用红宝石中的布尔值对对象进行排序
-
05-09-2019 - |
题
如果此之前已经回答或很明显,我很抱歉...在这里和GOOG上进行了一些搜索,找不到答案。
我希望按价格按价格分类,以及它们是否是Preferred_provider? (对或错)
例如 array p of Providers
...
p1.price == 1, p1.preferred_provider? == false
p2.price == 2, p2.preferred_provider? == true
p2.price == 3, p3.preferred_provider? == true
我想p.sort_by并得到:
[p2 p3 p1]
IAW
p.sort_by {|x| x.preferred_provider?, x.price }
不起作用并得到...
undefined method `<=>' for false:FalseClass
关于更好的方法来解决此问题的任何建议吗?
解决方案
大多数语言都提供了接受的排序功能 比较器 对于这种事情。在Ruby中,这只是阵列。
p.sort {|a, b| if (a.preferred_provider? == b.preferred_provider?
then a.price <=> b.price
elsif a.preferred_provider?
1
else -1
}
其他提示
你可以定义一个 <=>
在 Provider
班级做您想做的事,然后使用 Array.sort
方法(而不是 Enumerable.sort_by
)。这是一个定义 <=>
我鞭打了:
class Provider
def <=>(other)
if preferred_provider?
if other.preferred_provider?
@price <=> other.price
else
1
end
else
if other.preferred_provider?
-1
else
@price <=> other.price
end
end
end
end
那,如果您有数组 p
, ,你可以做 p_sorted = p.sort
.
(请注意,我尚未测试此代码,因此可能有一些错误,但我认为它可以演示这个想法。)
不隶属于 StackOverflow