我有一个包含整数值和字符串类型字符的数组 _ 这是我的数组 array = ["_", 2, 3, "_"] 如何对它们进行排序,使其返回如下所示: [2, 3, "_", "_"] 我试着用Ruby来分类 .sort() 方法,但它似乎 sort() 不将整数与字符串进行比较,因此返回错误。有没有我不知道的ruby方法?非常感谢您的帮助或指导。
_
array = ["_", 2, 3, "_"]
[2, 3, "_", "_"]
.sort()
sort()
iqjalb3h1#
问题是无法将字符串与整数进行比较:
> 2<"2" (irb):15:in `<': comparison of Integer with String failed (ArgumentError)
修复方法(使用您的具体示例)是 array 假装一切都是弦。鉴于:
array
如果只希望结果为统一字符串数组:
> 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 :
.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 或者其他可枚举排序不是稳定排序,因此比较相等的元素可能会以与给定不同的顺序返回:
.sort_by
> 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]
或者,正如评论中指出的那样:
> array.sort_by.with_index { |e, i| [0, i] } => [1, 2, 3, 4, 5, 6, 7, 8, 9]
1条答案
按热度按时间iqjalb3h1#
问题是无法将字符串与整数进行比较:
修复方法(使用您的具体示例)是
array
假装一切都是弦。鉴于:
如果只希望结果为统一字符串数组:
如果希望图元保持其类型,请执行以下操作:
或者,或者:
这里潜在的问题是,如果您仅依赖字符串的转换(这解决了您给出的示例),那么整数的结果会很糟糕:
这不是完全可以通过使用
.to_i
:通过在以下两个方面进行排序,可以最好地解决这一问题:
幸运的是,ruby使它非常容易选择。
注意,
.sort_by
或者其他可枚举排序不是稳定排序,因此比较相等的元素可能会以与给定不同的顺序返回:要立即解决此问题,请添加索引:
或者,正如评论中指出的那样: