java的api中这个方法
sort(List <T> list, Comparator <? super T> c)
api的解释是:根据指定比较器产生的顺序对指定列表进行排序。
Comparator里的compare方法在api里解释是:比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。
问题:重写Comparator里的compare方法,compare根据传进去的两个对象进行对比后返回一个整数,compare只是返回了一个整数来表明<,=,>,但是并没有根据compare的返回结果对这两个对象进行某种排序,那么最后比较器是怎么产生顺序的?
sort(List <T> list, Comparator <? super T> c)
api的解释是:根据指定比较器产生的顺序对指定列表进行排序。
Comparator里的compare方法在api里解释是:比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。
问题:重写Comparator里的compare方法,compare根据传进去的两个对象进行对比后返回一个整数,compare只是返回了一个整数来表明<,=,>,但是并没有根据compare的返回结果对这两个对象进行某种排序,那么最后比较器是怎么产生顺序的?
解决方案 »
- win7 如何删除System Volume Information
- java中如何输入字符串,并且限制字符串可输入的长度?
- 请教一下网络通信的问题
- log4j 的问题[程序日志]
- 使用swt做java应用程序开发.那多窗口是乍么实现的
- 请问这个问题该怎么改?
- 帮QQ-27193873朋友问个java排序的问题
- 小看看~
- 我觉得APPLET不能连接数据库的话就没有什么意思了,还能做什么?
- to:asper(天使之翼)顺便再问一下,那个附带原程序里有c02-c13加上一个com,那个是对应那一章,那一节的怎么看?
- 能不能帮我分析下这两个程序的效率问题
- java怎么把数据库返回数据添加到窗口表格上
楼主看下api Comparable接口的内容。不要与Comparator弄混子。
交换某两个原素的位置这两件事跟据一定的规则做很多次,实现对一个集合内元素的排列,这就是所谓的排序算法。Comparator负责的只是第一件事: 比较某两个元素的大小。
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位置的数据
}
}
}
我的意思就是Comparator是比较器它本身只负责比较两个数据,然后把结果返回,sort根据返回结果进行排序,那我怎么知道sort是怎么排序的?也就是说假如进行某个排序,Comparator只是返回比较结果,问题是根本不知道sort根据不同比较结果进行什么样的排序(比如Comparator返回的比较结果是1,sort怎么进行排序;返回-1,又是怎么排序),怎么确定?
比如一个list里面放很多对象
而你写一个比较器,实现在Comparator接口,并重写了compare(T o1, T o2) 方法。
当调用sort进行对list中对象进行排序时,list中两两对象进行比较,比较方法就是采用compare()方法中实现在逻辑,而返回负整数、零或正整数
而你写一个比较器,实现了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返回一正数是,前后两个对角交换位置,从而实现了排序。
而你写一个比较器,实现了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返回一正数是,前后两个对象交换位置,从而实现了排序。
sort方法怎么实现,可以查看源码
但是一般思路都是从升序开始(可能人的意识是看到排序最初的印象是升序),但是因为sort本身是个模板,也就是希望sort不改变,由用户传入的比较器来决定排序,所以6L的伪代码就是基于升序的基础去处理的,sort里面只需要关心比较器的返回值,如果返回值大于0,则说明比较参数1大于比较参数2,则把参数1"沉底"(换过来说就是参数2冒泡),这样当用户改变比较器,原本参数1大于参数2应该返回大于0的,可用户却故意返回小于0,这样相当于比较器欺骗了sort,sort因为只关心结果,于是就认为参数2大于参数1,于是把参数2"沉底"(参数1冒泡),这样就相当于把“小”的放到最底,于是也就成了“降序”排序。
所以,排序的模板一般来说都是基于升序实现的,如果要达到“降序”,就由用户去实现比较器然后传给sort方法就可以了