【问题标题】:how to sort an array of strings and integers to show sorted integers first in ruby如何对字符串和整数数组进行排序以首先在 ruby​​ 中显示排序的整数
【发布时间】:2021-09-21 23:59:43
【问题描述】:

我有一个包含整数值和字符串类型字符的数组,例如_

这是我的数组 array = ["_", 2, 3, "_"] 我如何对它们进行排序,使其返回如下:[2, 3, "_", "_"] 我尝试使用 ruby​​ .sort() 方法对其进行排序,但似乎 sort() 无法比较带字符串的整数,因此返回错误。

有没有我不知道的 ruby​​ 方法?非常感谢任何帮助或指导。

【问题讨论】:

  • 嘿,是的,对不起,我的错。我编辑它并修复它!感谢您的提醒
  • array.map{|e| e.to_s}.sort
  • 您的结果不是很具体。您希望如何对数字和字符串进行排序?上升可能?那么数字字符串呢?或者他们应该简单地保持他们的相对顺序?例如,['b', 2, '0', 'a', 1] 的预期结果是什么?

标签: arrays ruby


【解决方案1】:

问题是你不能将字符串与整数进行比较:

> 2<"2"
(irb):15:in `<': comparison of Integer with String failed (ArgumentError)

解决方法(以您的具体示例为例)是让array 表现得好像它是所有字符串一样。

给定:

array = ["_", 2, 3, "_"]

如果你只希望结果是一个统一的字符串数组:

> array.map{|e| e.to_s}.sort
=> ["2", "3", "_", "_"]

如果您希望元素保持其类型:

> array.map{|e| [e.to_s, e]}.sort.map{|e| e[1]}
=> [2, 3, "_", "_"]

或者,或者:

> array.sort_by{|e| e.to_s}
=> [2, 3, "_", "_"]

这里的潜在问题是,如果您仅依赖于转换为字符串(解决了您给出的示例),您将得到一个不好的整数结果:

> array = ["10", 12, 3, "0", "b", "a"]
=> ["10", 12, 3, "0", "b", "a"]
> array.sort_by{|e| e.to_s}
=> ["0", "10", 12, 3, "a", "b"]   # desirable?

使用.to_i 不能完全解决这个问题:

> array.sort_by{|e| e.to_i}
=> ["0", "b", "a", 3, "10", 12]   # fixed?

这可能最好通过对两者进行排序来解决:

> array.sort_by{|e| [e.to_i, e.to_s]}
=> ["0", "a", "b", 3, "10", 12]

幸运的是,Ruby 让选择变得超级容易。


请注意,.sort_by 或其他enumerable sorts 不是 stable sort,因此比较相等的元素可能会以与给定不同的顺序返回:

> array=[1,2,3,4,5,6,7,8,9]
=> [1, 2, 3, 4, 5, 6, 7, 8, 9]
> array.sort_by{|e| 0}  # make them all compare equal 
=> [9, 2, 3, 4, 5, 6, 7, 8, 1]

现在要修复那个,添加一个索引:

> array.each_with_index.sort_by{|e,i| [0,i]}.map(&:first)
=> [1, 2, 3, 4, 5, 6, 7, 8, 9]

或者,正如 cmets 中指出的那样:

> array.sort_by.with_index { |e, i| [0, i] }
=> [1, 2, 3, 4, 5, 6, 7, 8, 9]

【讨论】:

  • 我正要评论你最后一个语句的顺序,但你修好了它(Bravo)。话虽如此,您可以通过将其更改为 array.sort_by.with_index { |e, i| [0, i] } #=&gt; [1, 2, 3, 4, 5, 6, 7, 8, 9] 来提高效率和 IMO 的可读性
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
相关资源
最近更新 更多