给定一个数组
x = [1, 3, 5, -1, -3, -5]
如果我们使用命令
x.sort {|i| i}
我们给定
x = [-1, -3, -5, 1, 3, 5]
有没有什么办法,给定我们的数组,让它以正确的升序/降序返回它并带有负数?例如
x = [-5, -3, -1, 1, 3, 5] or [5, 3, 1, -1, -3, -5]
编辑:
似乎 x.sort 可以解决这个问题,但如果有一个更复杂的问题,我想根据散列中给出的值从我的数组中排序,例如
x = [{:i=>1}, {:i=>2}, {:i=>3}, {:i=>4}, {:i=>5}]
y = {3=>10, 4=>-1, 2=>-2, 5=>-3, 1=>-4}
我希望能够根据 y 中的值对 x 进行排序,以便我的结果是
x = [{:i=>3}, {:i=>4}, {:i=>2}, {:i=>5}, {:i=>1}]
最佳答案
x = [1, 3, 5, -1, -3, -5]
x.sort # => [-5, -3, -1, 1, 3, 5]
x.sort {|a,b| a <=> b} # => [-5, -3, -1, 1, 3, 5]
x.sort {|a,b| b <=> a} # => [5, 3, 1, -1, -3, -5]
由于 Array#sort
method 预期的返回值,您的示例产生了意想不到的结果.基本上,当您只返回第一个参数时(当需要两个参数时),解释器只查看元素的符号 (-/0/+) 并将其用于排序。因此,根据底层排序算法,当它从数组生成对到您的 block 时,它只查看第一个元素的符号,所以类似于:
compare(1, 3) # => 1 (wrong, should be -1 since 1 < 3)
compare(1, 5) # => 1 (wrong, should be -1 since 1 < 5)
compare(1, -1) # => 1 (right, by complete accident)
[编辑] 根据您更新的问题,尝试使用以下排序比较器 block :
x.sort! {|a,b| y[b[:i]] <=> y[a[:i]]}
x # => [{:i=>3}, {:i=>4}, {:i=>2}, {:i=>5}, {:i=>1}]
读取 - 通过比较每个元素对 a
和 b
,通过查找它们的 对数组
散列 x
进行排序:iy
中的属性并按降序比较这些值。
关于ruby - 与负整数的 Ruby 数组排序不一致的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10049667/