【问题标题】:Sort an Array Mixed With Integers and Strings - Ruby对混合了整数和字符串的数组进行排序 - Ruby
【发布时间】:2014-08-06 21:36:16
【问题描述】:

我有一个数组,它必须按从低到高的顺序排序,然后按字母顺序排列。必须使用数组#sort_by

 i_want_dogs = ["I", "want", 5, "dogs", "but", "only", "have", 3]

我希望它输出:

 => [3,5,"I","but","dogs","have","only","want"]

我试过了:

 i_want_dogs.sort_by {|x,y| x <=> y }

我知道这显然是错误的,但我无法将整数和字符串结合起来。

【问题讨论】:

  • 你看过Enumerable#sort_by的文档吗?
  • 愚蠢的问题,但你需要它们在字符串和整数中吗? :D
  • 我做到了,但仍然无法弄清楚。我在想也许我必须将整数转换为 chr,然后将所有内容转换为数字并像块内的那样对其进行排序,或者类似的东西,但我无法正确使用语法。
  • @limelights - 是的,我需要它完全如上所示输出
  • 有趣的是,大写字母 I 在其他单词之前。 i_want_dogs.sort_by { |x, y| y.to_i &lt;=&gt; x.to_i } 应该让你非常接近,但“我”在最后。

标签: ruby arrays sorting


【解决方案1】:

sort 方法与一个定义比较器的块一起使用,该比较器可以满足您的需求。我写了一个简单的方法,它比较类相同时的值和不同时的类名。

def comparator(x, y)
  if x.class == y.class
    return x <=> y
  else
    return x.class.to_s <=> y.class.to_s
  end
end

像这样使用它:

i_want_dogs.sort { |x, y| comparator(x, y) }

【讨论】:

    【解决方案2】:

    使用partition将数字与字符串分开,分别排序并加入最终结果,例如

    i_want_dogs.partition { |i| i.is_a?(Fixnum) }.map(&:sort).flatten
    

    【讨论】:

      【解决方案3】:

      这会给你结果:

      i_want_dogs.sort_by {|x| x.to_s }
      

      更新:

      感谢@vacawama 指出它将按字母顺序对数字进行排序。如果您需要按数字的值对数字进行排序,您需要尝试其他答案。

      【讨论】:

      • 这正是我想要的。其他人一直使用不同的方法,但我需要使用 sort_by。谢谢+1
      • +1 非常聪明的解决方案!如果不区分大小写,我们还可以添加downcase,例如x.to_s.downcase
      • @vacawama - 它在我做的测试中正确排序,但我没有做很多测试。
      • 如果您在意的话,这不会对您的号码进行正确排序。数字按“字母顺序”排序,而不是按数字排序。例如。 [3, 32, 355, 4, 500] 按“字母顺序”排序。
      • @vacawama 你是对的。看起来为这个测试用例尝试 sort_by 是一种小的 ruby​​ 练习。如果确实需要对数字进行排序,那么他可以尝试您的答案和其他答案。
      【解决方案4】:

      首先您需要将数组中的元素转换为字符串。试试这个

      i_want_dogs.sort_by(&:to_s)
      

      这将返回

      [3,5,"I", "but", "dogs", "have", "only" "want"]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多