ruby - 稳定的 #sort 占用 block

标签 ruby sorting

我们找到here Ruby 中稳定 sort_by 的实现,适用于一般情况(即我可以提供自己的比较算法),并且在 this thread 中用户 tokland 描述了一种非常优雅的方法来进行稳定的 sort_by:

module Enumerable 
  def stable_sort_by 
    sort_by.with_index { |x, idx| [yield(x), idx] } 
  end 
end

将 Enumerator 对象与 with_index 一起使用的想法非常简单!我想找到一个类似的优雅解决方案来创建 #sort 函数的稳定版本,其中给定一个比较 block 。它将像这样使用:

sorted_people = people.stable_sort do |person|
  person.name
end 

最佳答案

这是一个解决方案(但远非优雅):

module Enumerable
  def stable_sort
    each_with_index.sort { |(x, i), (y, j)|
      r = yield(x, y)
      r == 0 ? i <=> j : r
    }.map(&:first)
  end
end

它生成一个 [element, index] 对数组,并通过将每两个元素传递给给定 block 来对它们进行排序(就像 sort 所做的那样)。如果 block 返回0,它会比较索引,否则,它返回 block 的结果。然后,从生成的数组中提取元素。

示例:

arr = [[2, :baz], [1,:foo], [1, :bar]]

arr.sort { |x, y| x[0] <=> y[0] }
#=> [[1, :bar], [1, :foo], [2, :baz]]

arr.stable_sort { |x, y| x[0] <=> y[0] }
#=> [[1, :foo], [1, :bar], [2, :baz]]

关于ruby - 稳定的 #sort 占用 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28235104/

相关文章:

javascript - 如何有条件地将选定的行从表A复制到表B?

java - 手动按升序对数组进行排序

ruby - 在子类化 Ruby 散列时如何重写 []= 方法?

ruby - 使用数组作为其中之一转换键和值

ruby - 为什么我的 ruby​​ 脚本中出现无限循环?

Java根据字符串对自定义对象列表进行排序

javascript - 理解外部函数(数组)的返回函数(x)

file - 有人可以指点我一本未分类的字典吗?

ruby - 使用 activerecord API 将图像上传到 Postgres 数据库时出现问题

ruby-on-rails - 按键对嵌套哈希中的项目进行排序