Arrays 理解“排序!”块

Arrays 理解“排序!”块,arrays,ruby,sorting,counting,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"] 定义排序时或排序块您必须接受两个参数,通常是a和b。这是排序操作当时比较的两个元素,因此将使用不同的对重复调用此块 对返回的内容有一些限制,根据定义,您应该只返回-1、0或

现在我有一个数组

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

定义
排序时
排序块您必须接受两个参数,通常是
a
b
。这是排序操作当时比较的两个元素,因此将使用不同的对重复调用此块

对返回的内容有一些限制,根据定义,您应该只返回-1、0或+1。其他值可能有效,但不属于规范的一部分。如果序列中
a
应位于
b
之后,则返回
-1
,如果它们相等,则返回
0
,如果
b
应位于
a
之后,则返回
1

此外,对于任何给定的
a
b
c
值集,您应该返回一致的结果,以便如果
a
b
a
。如果您返回随机值,那么您的数组将是一片混乱,不一定会被完全排序。排序算法中的优化取决于一致的结果。如果说
a
c
之后,那么
a
之后的所有值也必须在
c
之后

Ruby很有可能将所有的正值压缩成第二项在第一项之前的表示。因为在所有情况下都返回一个正值,所以告诉排序算法所有值都比其他值先,这完全是胡说八道,因为这永远不会发生

因此,简而言之,您得到的是垃圾,因为您提供了
排序
函数junk,垃圾输入,垃圾输出原则适用

解决方法是使用
sort\u by
方法,该方法只接受一个参数并为您处理这些比较:

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

定义
排序时
排序块您必须接受两个参数,通常是
a
b
。这是排序操作当时比较的两个元素,因此将使用不同的对重复调用此块

对返回的内容有一些限制,根据定义,您应该只返回-1、0或+1。其他值可能有效,但不属于规范的一部分。如果序列中
a
应位于
b
之后,则返回
-1
,如果它们相等,则返回
0
,如果
b
应位于
a
之后,则返回
1

此外,对于任何给定的
a
b
c
值集,您应该返回一致的结果,以便如果
a
b
a
。如果您返回随机值,那么您的数组将是一片混乱,不一定会被完全排序。排序算法中的优化取决于一致的结果。如果说
a
c
之后,那么
a
之后的所有值也必须在
c
之后

Ruby很有可能将所有的正值压缩成第二项在第一项之前的表示。因为在所有情况下都返回一个正值,所以告诉排序算法所有值都比其他值先,这完全是胡说八道,因为这永远不会发生

因此,简而言之,您得到的是垃圾,因为您提供了
排序
函数junk,垃圾输入,垃圾输出原则适用

解决方法是使用
sort\u by
方法,该方法只接受一个参数并为您处理这些比较:

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

请参考官方文档,您在块中传递了错误数量的参数,因此funky outputThis是按出现次数排序的一种非常低效的方法。即使使用
sort_by
(存储块的结果),也会为每个元素调用
count
。请参阅官方文档,您在块中传递了错误数量的参数,因此funky输出这是一种非常低效的按出现次数排序的方法。即使使用
sort\u by
(存储块的结果),也会为每个元素调用
count
。“根据定义,您应该返回-1、0或+1”-这表示
sort
的文档没有那么严格,它说的是“小于0的整数”、“0”或“大于0的整数”。@Stefan是文档版本特定的,例如2.2状态-1,0+1,然后文档被更改为2.3+,如果我们是特定的,文档实际上状态是大于“o”的整数:)“根据定义,您应该返回-1、0或+1”-这表示
sort
的文档没有那么严格,它说的是“小于0的整数”、“0”或“大于0的整数”。@Stefan是文档版本特定的,例如2.2状态-1,0+1,然后文档被更改为2.3+,如果我们是特定的,文档实际上状态是大于“o”的整数:)