现在我有一个数组
letter = ['a','b','c','a','b','c','a','b','b']
有人可以解释以下返回值吗?
letter.sort! { |x| letter.count(x) }
#=> ["b", "b", "a", "c", "c", "a", "b", "b", "a"]
答案 0 :(得分:5)
定义sort
或sort!
块时,您有义务接受两个参数,通常是a
和b
。这些是排序操作当时比较的两个元素,因此将使用各种对重复调用此块。
对您返回的内容施加了限制,根据定义,您应该仅返回-1,0或+1 。其他值可能有效,但不是规范的一部分。如果-1
应该在系列中的a
之后,则会返回b
,0
如果它们是等效的,则返回1
b
如果a
应该来自a
。
此外,对于任何给定的b
,c
和a < b
值,您应该返回一致的结果,如果b < c
和a < c
那么{{ 1}}。如果你返回随机值,你的数组将是一个完全混乱,并且不一定完全排序。排序算法中的优化取决于一致的结果。如果您在a
之后发出c
,则a
之后的所有值也必须在c
之后。
很可能Ruby正在将所有正面价值折叠成第二个词在第一个词之前出现的迹象。由于您为所有情况返回正值,因此您告诉排序算法所有值都在所有其他值之前,这是完全无意义的,因为这种情况永远不会发生。
因此,简而言之,您正在收回垃圾邮件,因为您正在提供sort
功能垃圾邮件,并且 Garbage In,Garbage Out 原则适用。
解决这个问题的方法是使用sort_by
方法,该方法只接受一个参数并为您处理这些比较:
letters.sort_by! { |x| letter.count(x) }