首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解` `sort!`块

理解` `sort!`块
EN

Stack Overflow用户
提问于 2017-11-07 13:23:56
回答 1查看 94关注 0票数 0

现在我有一个数组

代码语言:javascript
复制
letter = ['a','b','c','a','b','c','a','b','b']

有人能解释一下下面的返回值吗?

代码语言:javascript
复制
letter.sort! { |x| letter.count(x) }
 #=> ["b", "b", "a", "c", "c", "a", "b", "b", "a"]
EN

回答 1

Stack Overflow用户

发布于 2017-11-07 13:43:39

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

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

此外,对于任何给定的abc值集合,您应该返回一致的结果,以便如果是a < bb < c,则是a < c。如果你返回的是随机值,你的数组就会变得一团糟,而且不一定会被完全排序。排序算法中的优化依赖于一致的结果。如果您说ac之后,那么a之后的所有值也必须在c之后。

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

所以,简而言之,你得到的是垃圾,因为你给了sort函数垃圾,垃圾入,垃圾出原则适用。

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

代码语言:javascript
复制
letters.sort_by! { |x| letter.count(x) }
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47150532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档