求助关于Comparator接口排序的问题!!

wswangxiaohu 2012-07-18 01:10:46
java的api中这个方法
sort(List <T> list, Comparator <? super T> c)
api的解释是:根据指定比较器产生的顺序对指定列表进行排序。
Comparator里的compare方法在api里解释是:比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。
问题:重写Comparator里的compare方法,compare根据传进去的两个对象进行对比后返回一个整数,compare只是返回了一个整数来表明<,=,>,但是并没有根据compare的返回结果对这两个对象进行某种排序,那么最后比较器是怎么产生顺序的?
...全文
632 14 打赏 收藏 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
qybao 2012-07-18
  • 打赏
  • 举报
回复
Comparator是比较器,它本身只负责比较两个数据,然后把结果返回,至于它的调用者获的返回结果后如何处理它不管,也就是说Comparator本身不负责排序,只负责比较,排序处理是它的调用者实现的,也就是在sort方法里实现的

sort的伪代码可以这样(假设使用冒泡法)
for (int i=0; i<list.size(); i++) {
for (int j=0; j<list.size()-i-1; j++) {
if (c.compare(list.get(j), list.get(j+1)) > 0) {//比较器只负责比较,本身不排序
//如果相邻两个数据前者大于后者则交换两个数据,也就是排序由sort方法负责
T temp = list.get(j);
list.set(j, list.get(j+1));
list.set(j+1, temp); //交换j和j+1位置的数据
}
}
}
tr106501 2012-07-18
  • 打赏
  • 举报
回复
呵呵,建议LZ静下心来看看书哦。google一些实例看看,或者找本java的书,还有学会看Java的API,那样收获会更大一些。
raistlic 2012-07-18
  • 打赏
  • 举报
回复
排序需要做的就两件事:

比较某两个元素的大小
交换某两个原素的位置

这两件事跟据一定的规则做很多次,实现对一个集合内元素的排列,这就是所谓的排序算法。

Comparator负责的只是第一件事: 比较某两个元素的大小。
YOULOVEXIA 2012-07-18
  • 打赏
  • 举报
回复
看看jdk的api
sdojqy1122 2012-07-18
  • 打赏
  • 举报
回复
比较规则是根据 Comparator的,但是如何排序就是sort的事情了,应该是sort调用了comparator的比较规则,具体是怎么调用的,可以自己去翻源码。
brightyq 2012-07-18
  • 打赏
  • 举报
回复
是实现Comparable接口,重写compareTo(T o) 方法。
楼主看下api Comparable接口的内容。不要与Comparator弄混子。
sdojqy1122 2012-07-18
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

引用 8 楼 的回复:
[Quote=引用 6 楼 的回复:]

非常感谢你认真的解答。
我的意思就是Comparator是比较器它本身只负责比较两个数据,然后把结果返回,sort根据返回结果进行排序,那我怎么知道sort是怎么排序的?也就是说假如进行某个排序,Comparator只是返回比较结果,问题是根本不知道sort根据不同比较结果进行什么样的排序(比如Comparator返回的……
[/Quote]
恩,默认是升序,所以排序就看你的比较器是怎么比较了。
qybao 2012-07-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
[Quote=引用 6 楼 的回复:]

非常感谢你认真的解答。
我的意思就是Comparator是比较器它本身只负责比较两个数据,然后把结果返回,sort根据返回结果进行排序,那我怎么知道sort是怎么排序的?也就是说假如进行某个排序,Comparator只是返回比较结果,问题是根本不知道sort根据不同比较结果进行什么样的排序(比如Comparator返回的比较结果是1,sort怎么进行……
[/Quote]

sort方法怎么实现,可以查看源码
但是一般思路都是从升序开始(可能人的意识是看到排序最初的印象是升序),但是因为sort本身是个模板,也就是希望sort不改变,由用户传入的比较器来决定排序,所以6L的伪代码就是基于升序的基础去处理的,sort里面只需要关心比较器的返回值,如果返回值大于0,则说明比较参数1大于比较参数2,则把参数1"沉底"(换过来说就是参数2冒泡),这样当用户改变比较器,原本参数1大于参数2应该返回大于0的,可用户却故意返回小于0,这样相当于比较器欺骗了sort,sort因为只关心结果,于是就认为参数2大于参数1,于是把参数2"沉底"(参数1冒泡),这样就相当于把“小”的放到最底,于是也就成了“降序”排序。
所以,排序的模板一般来说都是基于升序实现的,如果要达到“降序”,就由用户去实现比较器然后传给sort方法就可以了
brightyq 2012-07-18
  • 打赏
  • 举报
回复
刚打出错别字了,修正:

比如一个list里面放很多对象
而你写一个比较器,实现了Comparator接口,并重写了compare(T o1, T o2) 方法。
当调用sort进行对list中对象进行排序时,list中两两对象进行比较,比较方法就是采用compare()方法中实现的逻辑,而返回负整数、零或正整数。而内就是根据这个返回值,如果是两个对象比较后,返回一正整数,则说明前一个对象大于后一个对象,这里将对list中的这两对象进行对调。大致的源码就是这样:

for (int j=i; j>low && c.compare(dest[j-1], dest[j])>0; j--)
swap(dest, j, j-1);


所以可以看出,当compare返回一正数是,前后两个对交换位置,从而实现了排序。
brightyq 2012-07-18
  • 打赏
  • 举报
回复
上一个回复,没回完就点提交了。接着说。

比如一个list里面放很多对象
而你写一个比较器,实现了Comparator接口,并重写了compare(T o1, T o2) 方法。
当调用sort进行对list中对象进行排序时,list中两两对象进行比较,比较方法就是采用compare()方法中实现的逻辑,而返回负整数、零或正整数。而内存就是根据这个返回值,如果是两个对象比较后,返回一正整数,则说明前一个对象大于后一个对象,这里将对list中的这两对象进行对调。大致的源码就是这样:

for (int j=i; j>low && c.compare(dest[j-1], dest[j])>0; j--)
swap(dest, j, j-1);

所以可以看出,当compare返回一正数是,前后两个对角交换位置,从而实现了排序。
brightyq 2012-07-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
[Quote=引用 6 楼 的回复:]

非常感谢你认真的解答。
我的意思就是Comparator是比较器它本身只负责比较两个数据,然后把结果返回,sort根据返回结果进行排序,那我怎么知道sort是怎么排序的?也就是说假如进行某个排序,Comparator只是返回比较结果,问题是根本不知道sort根据不同比较结果进行什么样的排序(比如Comparator返回的比较结果是1,sort怎么进行……
[/Quote]

比如一个list里面放很多对象
而你写一个比较器,实现在Comparator接口,并重写了compare(T o1, T o2) 方法。
当调用sort进行对list中对象进行排序时,list中两两对象进行比较,比较方法就是采用compare()方法中实现在逻辑,而返回负整数、零或正整数
wwwcomcn123 2012-07-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
[Quote=引用 6 楼 的回复:]

非常感谢你认真的解答。
我的意思就是Comparator是比较器它本身只负责比较两个数据,然后把结果返回,sort根据返回结果进行排序,那我怎么知道sort是怎么排序的?也就是说假如进行某个排序,Comparator只是返回比较结果,问题是根本不知道sort根据不同比较结果进行什么样的排序(比如Comparator返回的比较结果是1,sort怎么进行……
[/Quote]

第一个参数小于第二个参数 返回负数

第一个参数大于第二个参数 返回正数

第一个参数等于第二个参数 返回0
wswangxiaohu 2012-07-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

非常感谢你认真的解答。
我的意思就是Comparator是比较器它本身只负责比较两个数据,然后把结果返回,sort根据返回结果进行排序,那我怎么知道sort是怎么排序的?也就是说假如进行某个排序,Comparator只是返回比较结果,问题是根本不知道sort根据不同比较结果进行什么样的排序(比如Comparator返回的比较结果是1,sort怎么进行排序;返回-1,又是怎么排序),怎么确定?

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧