面向对象之自定义排序器原理

137 阅读1分钟

近期编写MapReduce程序又遇到了自定义排序,尽管我知道怎么编写,实际上我知道的是返回-1是升序,并不明白为什么返回-1是升序。

想象一下,如果别人替你编写排序器,那你一定希望别人尽可能多做,你自己尽可能少做,那么少做的你最少要提供哪些参数呢?答案是三个参数:容器、容器成员的量化字段(或量化方式)、排列的升降,这意味着你希望别人向你提供的排序方法是这样的sort(容器,量化字段,排列升降),于是Java排序器的编码方式显得很奇怪,它通过比较两项数据并返回1或-1来定义了排列的升降。

这个问题困扰了我很久,直到我决定研究其源代码,当我看到自定义排序器被快速排序的代码调用后恍然大悟。

快速排序算法把数组分为3个部分:左部分、中值、右部分,这恰好对应了排序器的3个返回值-1 0 1,如果是升序,左部分存储较小值,右部分存储较大值。

答案显而易见:返回-1,当前对象被分配到左部分;返回1,当前对象被分配到右部分。若你的排序器定义了当前对象大于入参时返回1(示例:if(this.attribute>o.attribute) return 1;),以及当前对象小于如参数时返回-1,那么这将是升序排列。降序排列依此类推。