gpt4 book ai didi

Ruby Array#sort 它如何知道 block 应该按升序或降序排序

转载 作者:行者123 更新时间:2023-12-05 08:29:26 25 4
gpt4 key购买 nike

相关问题已在 https://stackoverflow.com/a/11427868/936494 上提供但我想了解的是

使用时

a.sort { |x, y| x <=> y } 

它怎么知道这个 block 应该按升序排序,在使用时也是如此

a.sort { |x, y| y <=> x } 

它怎么知道这个 block 应该按降序排序?我很困惑,因为这两个 block 都使用了宇宙飞船运算符,并且在 a.sort { |x, y| x <=> y } 的情况下,预计在每次比较期间都会返回以下内容

  • -1 如果 x < y
  • 0 如果 x == y
  • 1 如果 x > y

在每次比较期间,如果是 a.sort { |x, y| y <=> x },则以下内容

  • -1 如果 y < x
  • 0 如果 y == x
  • 1 如果 y > x

现在让我们以数组为例:

2.3.2 :023 > a = [ "d", "a", "e", "c", "b" ]
=> ["d", "a", "e", "c", "b"]

当我们使用 a.sort { |e1, e2| p [e1, e2]; e1 <=> e2 } 对其进行排序时结果如下:

["d", "a"] (cmp result: 1)
["c", "b"] (cmp result: 1)
["e", "b"] (cmp result: 1)
["e", "c"] (cmp result: 1)
["a", "b"] (cmp result: -1)
["d", "b"] (cmp result: 1)
["d", "c"] (cmp result: 1)
["d", "e"] (cmp result: -1)
=> ["a", "b", "c", "d", "e"]

现在在这种情况下,它如何知道“a”应该放在第一位,然后是“b”,然后是“c”等等?

类似地,当我们使用 a.sort { |e1, e2| p [e2, e1]; e2 <=> e1 } 对其进行排序时结果如下:

["a", "d"] (cmp result: -1)
["b", "c"] (cmp result: -1)
["c", "e"] (cmp result: -1)
["e", "d"] (cmp result: 1)
["c", "d"] (cmp result: -1)
["c", "a"] (cmp result: 1)
["b", "a"] (cmp result: 1)
=> ["e", "d", "c", "b", "a"]

那么在这种情况下,它怎么知道“e”应该放在第一位,然后是“d”,然后是“c”等等?考虑到两个元素的比较这一事实在这两个 block 中应该返回 1、0 或 -1?

最佳答案

block 返回的值告诉sort哪个元素在列表中排在第一位。如果 block 返回 1 ,这意味着第一个 block 参数被认为“大于”第二个 block 参数,因此第一个 block 参数必须在排序结果中的第二个参数之后。

一件有趣的事是 Ruby 的 sort算法利用了比较的传递特性:在你的第一个例子中,它从未直接比较过“a”和“c”,但它的其他比较表明“a”<“b”和“b”<“c”所以它在结果中将“c”放在“a”之后。

表达式y <=> x相当于-(x <=> y) (假设两个对象的类都实现了一个合理的宇宙飞船操作符)。所以如果你按 y <=> x 排序, 所有单独的比较都会倒置,排序后的数组必须以相反的顺序排列。

关于Ruby Array#sort 它如何知道 block 应该按升序或降序排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70395532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com