ruby - 与负整数的 Ruby 数组排序不一致的行为

标签 ruby arrays sorting

给定一个数组

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

读取 - 通过比较每个元素对 ab,通过查找它们的 对数组 x 进行排序:i 散列 y 中的属性并按降序比较这些值。

关于ruby - 与负整数的 Ruby 数组排序不一致的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10049667/

相关文章:

c# - 如何使用 LINQ 对从文件加载的数据进行排序

ruby - 阻止 Ruby 自动转义字符串

ruby-on-rails - 如何使用ruby将图像文件转换为字节数组

ruby-on-rails - 使用 Sunspot 从 Solr 索引中排除文章草稿

ios - Swift - 从数组中读取

java - 使用 double 值的绝对值对 HashMap 进行排序

ruby - Ruby 中数组哈希的所有可能组合

javascript - 如何获取多维数组中的连续数值 1,2,3,4,5 等

c# - 我如何在 c# 中的特定字段值的结构数组上进行二进制搜索?

arrays - 遍历数组广度搜索