如何对包含字符串和数字的Ruby数组进行排序

3

我需要在Ruby中对一个混合数组进行排序。它包含FixnumString类型的元素。

ar = [1, "cool", 3, "story", 4, "bro"]

我想让Fixnum类型的元素优先排列,不关心字符串元素的顺序。

ar = [1,3,4,"cool","story","bro"]

我尝试过为Array类编写方法。

Class Array
  def mixed_sort
    self.sort do |a,b|
      if a.class == Fixnum and b.class != a.class
        -1
      else
        a <=> b
      end
    end
  end
end

我曾尝试给Array#sort方法传递一个代码块,但是在执行代码块之前这个方法仍然会抛出一个错误。

[1] pry(main)> [1, "11", '12', 3, "cool"].mixed_sort
ArgumentError: comparison of String with 3 failed
from /config/initializers/extensions/array.rb:3:in `sort'
3个回答

6
我会使用Enumerable#grep进行如下操作:
ar = [1, "cool", 3, "story", 4, "bro"]
ar.grep(Fixnum).sort + ar.grep(String)
# => [1, 3, 4, "cool", "story", "bro"]

如果你想对字符串进行排序,可以按照以下步骤操作:
ar = [1, "cool", 3, "story", 4, "bro"]
ar.grep(Fixnum).sort + ar.grep(String).sort
# => [1, 3, 4, "bro", "cool", "story"]

1

实际上,我一直需要先按Fixnum排序,然后是String元素:

ar.sort_by { |n| n.to_s } # => [1, 3, 4, "bro", "cool", "story"]

这只是将元素转换为字符串进行比较,但返回的Fixnum仍保持原始状态。

1
a, b = [1, "cool", 3, "story", 4, "bro"].partition(&Fixnum.method(:===))
a.sort + b #=> [1, 3, 4, "cool", "story", "bro"]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接