理解`sort!`块

时间:2017-11-07 05:23:56

标签: arrays ruby sorting counting

现在我有一个数组

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"]

1 个答案:

答案 0 :(得分:5)

定义sortsort!块时,您有义务接受两个参数,通常是ab。这些是排序操作当时比较的两个元素,因此将使用各种对重复调用此块。

对您返回的内容施加了限制,根据定义,您应该仅返回-1,0或+1 。其他值可能有效,但不是规范的一部分。如果-1应该在系列中的a之后,则会返回b0如果它们是等效的,则返回1 b如果a应该来自a

此外,对于任何给定的bca < b值,您应该返回一致的结果,如果b < ca < c那么{{ 1}}。如果你返回随机值,你的数组将是一个完全混乱,并且不一定完全排序。排序算法中的优化取决于一致的结果。如果您在a之后发出c,则a之后的所有值也必须在c之后。

很可能Ruby正在将所有正面价值折叠成第二个词在第一个词之前出现的迹象。由于您为所有情况返回正值,因此您告诉排序算法所有值都在所有其他值之前,这是完全无意义的,因为这种情况永远不会发生。

因此,简而言之,您正在收回垃圾邮件,因为您正在提供sort功能垃圾邮件,并且 Garbage In,Garbage Out 原则适用。

解决这个问题的方法是使用sort_by方法,该方法只接受一个参数并为您处理这些比较:

letters.sort_by! { |x| letter.count(x) }