理解`sort!`块

0 ruby arrays sorting counting

现在我有一个阵列

letter = ['a','b','c','a','b','c','a','b','b']
Run Code Online (Sandbox Code Playgroud)

有人可以解释以下返回值吗?

letter.sort! { |x| letter.count(x) }
 #=> ["b", "b", "a", "c", "c", "a", "b", "b", "a"]
Run Code Online (Sandbox Code Playgroud)

tad*_*man 5

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

有强加给你回什么限制,根据定义,你应该-1,0或+1返回.其他值可能有效,但不是规范的一部分.您将返回-1如果a要来后,b在系列中,0如果他们是等价的,1如果b要来之后a.

此外,对于任何给定的a,bc值,你应该返回一致的结果,例如,如果a < bb < ca < c.如果你返回随机值,你的数组将是一个完整的混乱,并不一定完全排序.排序算法中的优化取决于一致的结果.如果你说a之后,c所有后来的价值也a必须在之后c.

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

所以,简而言之,你得到了垃圾,因为你给了sort垃圾功能垃圾和垃圾输出原则.

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

letters.sort_by! { |x| letter.count(x) }
Run Code Online (Sandbox Code Playgroud)