之前提到过,最近在学Ruby编程语言。

作为新一代的动态语言,Ruby内置了很多强大的内置功能。比如在数组方面,缺省就有排序功能,免去了自己编制排序命令的麻烦。

在缺省情况下,对数组执行.sort就可以返还以递增顺序排序的新数组。但问题在于,若这是一个多维数组,比如二维的,直接执行.sort只会针对第一维排序,若要按照第二维来排序便无法直接操作了。后来查看语法说明,发现利用.sort附带的block功能便可轻松完成相关任务。

在.sort的block中,可以有两个参数,两者之间通过<=>进行比较,所以我们只需要在block中直接指定以两个参数的第二维来比较便可以了。见下面附录程序的第一块。

利用block,我们可以大大的扩充.sort的功能,比如虽然.sort之后再.reverse可以实现递减排序,但更好直接的方法是交换<=>前后的顺序,便可以完成。请注意下面附录程序的第二段。

当然,其实我们不仅可以针对数组中的元素本身排序,还可以针对任何由此衍生出的属性进行排序,比如下面就是比较每个元素的长度,并按照字符长度递增排序。只要愿意,修改就可以实现更多不同种类的排序——比如按照元素中含有某个字母的数量排序等等。

`require ‘pp’

puts “指定以第二维数组排序”

a=[[1,3],[8,100],[5,36]]

pp a

puts “="*20

a=a.sort {|x,y| x[1] <=> y[1]}

pp a

puts “直接实现逆序排序”

a=[1,3,5,7,9]

pp a

puts “="*20

a=a.sort {|x,y| y<=>x }

pp a

puts “以数组元素长度排序”

a=[“aaa”,“bbbb”,“cc”]

pp a

puts “="*20

a=a.sort {|x,y| x.length <=> y.length}

pp a`

以下是程序执行结果:

指定以第二维数组排序

[[1, 3], [8, 100], [5, 36]]

====================

[[1, 3], [5, 36], [8, 100]]

直接实现逆序排序

[1, 3, 5, 7, 9]

====================

[9, 7, 5, 3, 1]

以数组元素长度排序

[“aaa”, “bbbb”, “cc”]

====================

[“cc”, “aaa”, “bbbb”]

Ruby的确是一种能够快速上手并且快速实现一些以前用Basic很复杂才能实现的功能,所以近期还把Ruby当作Linux的Shell语言来使用,这方面的体会改天在与诸位分享。