ruby - 为什么 Array#sort 在 OS X 和 Ubuntu 之间的行为不同?
问题描述
我阅读了https://8thlight.com/blog/will-warner/2013/03/26/stable-sorting-in-ruby.html并尝试复制其发现,我得到了一些有趣的结果。这只是非常糟糕的运气,还是我正在做某事?
这就是我在irb
OS X 10.11.6 上使用的内容rvm
:
2.3.1 :001 > (1..10).map { |a| [rand(2),a] }.shuffle.sort { |a, b| a[1] <=> b[1] }.sort { |a, b| a[0] <=> b[0] }
=> [[0, 7], [0, 8], [0, 4], [0, 6], [1, 9], [1, 1], [1, 10], [1, 2], [1, 3], [1, 5]]
2.3.1 :002 > (1..10).map { |a| [rand(2),a] }.shuffle.sort { |a, b| a[1] <=> b[1] }.sort { |a, b| a[0] <=> b[0] }
=> [[0, 10], [0, 7], [0, 8], [0, 1], [0, 4], [0, 5], [0, 6], [1, 2], [1, 3], [1, 9]]
2.3.1 :003 > (1..10).map { |a| [rand(2),a] }.shuffle.sort { |a, b| a[1] <=> b[1] }.sort { |a, b| a[0] <=> b[0] }
=> [[0, 7], [0, 8], [0, 3], [0, 10], [1, 1], [1, 9], [1, 6], [1, 2], [1, 4], [1, 5]]
2.3.1 :004 > (1..10).map { |a| [rand(2),a] }.shuffle.sort { |a, b| a[1] <=> b[1] }.sort { |a, b| a[0] <=> b[0] }
=> [[0, 5], [0, 8], [0, 9], [0, 2], [1, 7], [1, 1], [1, 10], [1, 3], [1, 4], [1, 6]]
2.3.1 :005 > (1..10).map { |a| [rand(2),a] }.shuffle.sort { |a, b| a[1] <=> b[1] }.sort { |a, b| a[0] <=> b[0] }
=> [[0, 1], [0, 5], [0, 7], [0, 10], [1, 8], [1, 6], [1, 9], [1, 2], [1, 3], [1, 4]]
2.3.1 :006 > (1..10).map { |a| [rand(2),a] }.shuffle.sort { |a, b| a[1] <=> b[1] }.sort { |a, b| a[0] <=> b[0] }
=> [[0, 4], [0, 5], [0, 9], [0, 3], [1, 8], [1, 1], [1, 10], [1, 2], [1, 6], [1, 7]]
2.3.1 :007 > (1..10).map { |a| [rand(2),a] }.shuffle.sort { |a, b| a[1] <=> b[1] }.sort { |a, b| a[0] <=> b[0] }
=> [[0, 6], [0, 2], [0, 3], [0, 4], [0, 5], [1, 10], [1, 7], [1, 8], [1, 9], [1, 1]]
2.3.1 :008 > RUBY_VERSION
=> "2.3.1"
这些发现与博客文章相符——最终结果没有按照您期望的方式排序,这是有道理的,因为 Ruby 排序并不意味着稳定。
如果我通过 ssh 进入 Ubuntu 16.04 服务器并运行相同的代码,我的数组就会出现排序!
2.3.1 :001 > (1..10).map { |a| [rand(2),a] }.shuffle.sort { |a, b| a[1] <=> b[1] }.sort { |a, b| a[0] <=> b[0] }
=> [[0, 2], [0, 4], [0, 6], [0, 7], [0, 8], [0, 9], [0, 10], [1, 1], [1, 3], [1, 5]]
2.3.1 :002 > (1..10).map { |a| [rand(2),a] }.shuffle.sort { |a, b| a[1] <=> b[1] }.sort { |a, b| a[0] <=> b[0] }
=> [[0, 1], [0, 2], [0, 4], [0, 5], [0, 6], [0, 8], [0, 10], [1, 3], [1, 7], [1, 9]]
2.3.1 :003 > (1..10).map { |a| [rand(2),a] }.shuffle.sort { |a, b| a[1] <=> b[1] }.sort { |a, b| a[0] <=> b[0] }
=> [[0, 1], [0, 2], [0, 6], [0, 10], [1, 3], [1, 4], [1, 5], [1, 7], [1, 8], [1, 9]]
2.3.1 :004 > (1..10).map { |a| [rand(2),a] }.shuffle.sort { |a, b| a[1] <=> b[1] }.sort { |a, b| a[0] <=> b[0] }
=> [[0, 1], [0, 3], [0, 9], [0, 10], [1, 2], [1, 4], [1, 5], [1, 6], [1, 7], [1, 8]]
2.3.1 :005 > (1..10).map { |a| [rand(2),a] }.shuffle.sort { |a, b| a[1] <=> b[1] }.sort { |a, b| a[0] <=> b[0] }
=> [[0, 1], [0, 4], [0, 7], [0, 8], [1, 2], [1, 3], [1, 5], [1, 6], [1, 9], [1, 10]]
2.3.1 :006 > RUBY_VERSION
=> "2.3.1"
这种行为是预期的吗?我读过的所有内容都表明 ruby 排序不稳定,如果你稳定排序很重要,你应该实现这样的东西。但是,如果这里发生了一些时髦的事情,我很想知道它是什么。
解决方案
推荐阅读
- .net - 单用户授权
- button - 为什么按下 MSP430 上的按钮不点亮 LED
- or-tools - 使用 CP-SAT 预测 300 万个布尔变量
- javascript - 如何使用 React 中的函数组件在 Dom 加载时显示 SweetAlert 弹出窗口
- c# - 错误:未找到“FileId”字段标头。参数名称:名称
- docker - nginx“http_headers_more”模块返回“不兼容二进制”错误
- android - 更新 Sharedpreferences 值
- elasticsearch - 如何在脚本评分中使用嵌套文档的值
- facebook - 在 Facebook 移动设备中共享链接时的缩略图比例
- php - php中的弹性搜索索引