Groovy list 实战

在所有的虚假的例子之后,应该看一个真实的应用:在列表4.10中实现Tony Hoare排序算法,为了使这件事情更有趣,先通过一般的方法来实现,为了排序不需要任何特定的数据类型,这样通过使用<、=和>操作符来完成比较工作。

快速排序的目标是使用较少的比较,这个策略依赖于在list中找到一个好的核心元素用来把list拆分为两个list:一个list中的所有元素都比核心元素小,另外一个list中的所有元素都比核心元素大,然后再递归调用这两个list,这后面的理论基础是不需要把一个列表的元素和另一个列表进行比较,如果总能找到正确的核心元素,这将精确的对半拆 分list,这个算法运行一个复杂的n*log(n),最坏的结果,每次都选择了一个边界元素 作为核心元素,那么排序将以n2结束,在列表4.10中,选择了list的中间元素,这通常是一个好的选择。

对比前面说过的,实际上在(1)处使用了三个列表而不是两个列表,当不想丢失重复出现的元素的时候使用这种实现方式。

可以像(2)那样排序不同的类型,甚至像(3)那样对字符串进行排序,原因是没有 为list中的条目指定任何的类型,由于类型实现了size/getAt(Index)/findAll方法,在这里直接作为一个sortable对象对待。

顺便说一下:groovy的sort方法使用JAVA的排序实现,这考虑到了最坏情况下的性能问题,考虑了n*log(n)的发生情况。

当然这个的实现也能进行多方面的优化,在这里的目标是整洁和灵活,而不是最好的性能。

如果没有groovy的帮助来解释快速排序算法,我们的伪代码看起来跟列表4.10一样,换句话说,groovy代码本身就是最好的用来描述做了什么工作的描述信息,想象一下,当代码读起来就像文档描述一样,你的代码是多么的重要。

已经讨论了groovy最强大功能之一的list,它们总是在手边;list的使用是一直的,并且也支持操作符,起初,也许会被list过多的可用方法吓住,但这也是list强大的原因。

现在可以使用list来做好自己的编码工作了。

接下来的将介绍与list相似的map,groovy扩展了java集合框架,提供了便利的快捷操作方式。