现在我有一个数组
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"]发布于 2017-11-07 13:43:39
定义sort或sort!块时,必须接受两个参数,通常是a和b。这是排序操作正在比较的两个元素,因此将使用不同的对重复调用此块。
对于您返回的内容有一些限制,根据定义,您应该只返回-1、0或+1。其他值也可以,但不是规范的一部分。如果在该系列中,a应该位于b之后,则返回-1;如果它们相等,则返回0;如果b应该位于a之后,则返回1。
此外,对于任何给定的a、b和c值集合,您应该返回一致的结果,以便如果是a < b和b < c,则是a < c。如果你返回的是随机值,你的数组就会变得一团糟,而且不一定会被完全排序。排序算法中的优化依赖于一致的结果。如果您说a在c之后,那么a之后的所有值也必须在c之后。
Ruby很可能正在将所有正值折叠成第二个项在第一个项之前的指示。由于您在所有情况下都返回一个正值,因此您告诉排序算法所有值都排在所有其他值之前,这完全是胡说八道,因为这永远不会发生。
所以,简而言之,你得到的是垃圾,因为你给了sort函数垃圾,垃圾入,垃圾出原则适用。
解决方法是使用sort_by方法,该方法只接受一个参数,并为您处理这些比较:
letters.sort_by! { |x| letter.count(x) }https://stackoverflow.com/questions/47150532
复制相似问题