在Ruby中排序数组(特例)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Ruby中排序数组(特例)相关的知识,希望对你有一定的参考价值。

我在Ruby中有一个数组,其值如下

xs = %w(2.0.0.1
2.0.0.6
2.0.1.10
2.0.1.5
2.0.0.8)

等等。我想对数组进行排序,以便最终结果应该是这样的:

ys = %w(2.0.0.1
2.0.0.6
2.0.0.8
2.0.1.5
2.0.1.10)

我尝试过使用array.sort函数,但它在"2.0.1.10"之前放置了"2.0.1.5"。我不确定为什么会这样

答案

使用Schwartzian transformEnumerable#sort_by),并利用由整数数组(lexicographical order)定义的Array#<=>

sorted_ips = ips.sort_by { |ip| ip.split(".").map(&:to_i) }

能否请你详细解释一下

  1. 你不能比较包含数字的字符串:"2" > "1",yes,但"11" < "2"因为字符串按字典顺序进行比较,就像字典中的单词一样。因此,您必须将ip转换为可比较的值(整数数组):ip.split(".").map(&:to_i)。例如,"1.2.10.3"被转换为[1, 2, 10, 3]。让我们称之为转型f
  2. 你现在可以使用Enumerable#sortips.sort { |ip1, ip2| f(ip1) <=> f(ip2) },但要检查是否可以使用更高的抽象Enumerable#sort_by。在这种情况下:ips.sort_by { |ip| f(ip) }。您可以将其读作“取ips并按照f映射定义的顺序对它们进行排序”。
另一答案

通过拆分'.'将数据拆分为块。这样做没有标准功能,因此您需要编写自定义排序来执行此操作。

你在2.0.1.10之前所说的关于2.0.1.5的行为是预期的,因为它将数据作为字符串并进行ASCII比较,从而导致你看到的结果。

arr1 = "2.0.0.1".split('.')
arr2 = "2.0.0.6".split('.')

对于输入中的所有数据,逐元素地比较arr1arr2元素。

以上是关于在Ruby中排序数组(特例)的主要内容,如果未能解决你的问题,请参考以下文章

如何在Ruby中将单词数组排序为字谜数组?

如何在 Ruby 中随机排序(打乱)数组?

在没有排序函数的数组中对字符串进行排序 - Ruby

如何在Ruby中按降序对数组进行排序

在Ruby中对数组使用冒泡排序方法[关闭]

运行 Ruby 冒泡排序