Java Comparator比较器返回值问题

whuyotc 2020-06-25 11:45:04
咨询一个问题,这里定义了一个Comparator 比较器,如果这个函数返回值直接是1,数组元素顺序居然保持不变;如果返回值直接是-1,
数组元素顺序反而是倒序了。

想请大佬答疑解惑,非常感谢。


import java.io.*;
import java.util.*;
public class phototest {
public static void main(String[] args) throws IOException {

Comparator<Integer> mycmp =new Comparator<Integer>() {
public int compare(Integer a, Integer b) {
return 1;//数组元素没有变化
//return -1//数组元素倒序了
}
};

Integer [] d = {9,8,10,90};
for(int i=0;i<d.length;i++) {
System.out.print(d[i] + " ");
}
System.out.println();
Arrays.sort(d, mycmp);

for(int i=0;i<d.length;i++) {
System.out.print(d[i] + " ");
}
System.out.println();
}
}

...全文
10801 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰思雨 2020-06-29
  • 打赏
  • 举报
回复
楼主的这个,强制返回1,顺序没改变;强制返回-1,倒序排列 的原因,是要看看JDK底层使用的是什么排序算法了。 不同版本的JDK所采用的排序算法是不同的。 以前版本的排序算法,小于7个元素的情况下,是插入排序,所以,会是楼主现在看到的这种结果。 后来版本的排序算法,采用的是二叉排序算法,采用楼主自定义的比较器后,二叉树退化成链表,所以,也是楼主现在看到的结果。 但是,这种结果,不具有普遍性。换句话说,就是,不是所有的排序算法,都会是这样的结果。
胖到没有朋友 2020-06-29
  • 打赏
  • 举报
回复
明白了底层使用的是插入排序之后,看起来就没有那么慢理解了,我们在做排序的时候,通常都会有判断前者和后者的大小,只有满足条件才会执行某写代码,只是现在判断的结果是你自己写的比较器返回的,但是现在你的比较器返回的是一个固定值,也就是说,他的判定结果一直是前面的比后面大,或者前面的比后面小,那他执行的时候,就要么不动,要么把它插到前面去。一直重复这个动作知道遍历完所有的元素。但是我们比较器正常写法是a-b,这个它在比较的时候有正有负,所以通过不断的插入,更换位置,就成了有序的了。
胖到没有朋友 2020-06-29
  • 打赏
  • 举报
回复
我刚才用你的代码测试了一下,发现确实是这样的效果,出现的原因你看了源码就能明白,截取排序方法的官方解释翻译 现在你的代码走的就是这个方法的排序,也就是插入排序,插入排序就是将元素插入到有序的数组中,因为你的比较器一直返回的都是1,所以它认为这个元素就是有序的,就不会执行任何的插入排序代码,通常我们都会写成a-b,在排序时,你现在的数据时,只需要执行一次插入就能达到有序。即把8插入到9之前
冰思雨 2020-06-28
  • 打赏
  • 举报
回复
楼主没有说明自己的疑惑是啥啊? 比较器的用途就是要返回两个元素的大小关系。 如果楼主强制所有元素的比较规则都是第一个元素比第二个元素大,也就是说直接返回1,那么,拿这个比较器对象进行比较排序之后的顺序,就和排序算法有关了。 关于排序算法,常见的有7种吧,楼主可以挑一个简单易懂的排序算法,拿你自定义的比较器进行模拟实验一下,就知道具体是怎么回事了。 至于楼上所说的,原来集合的先后关系不发生变化这个结论,我是不赞同的。 不同的排序算法,产生的结果不一定相同。 比如, 采用冒泡排序之后,这个集合的顺序就被倒序排列了。 采用插入排序的结果应该是前后顺序不变。
whuyotc 2020-06-25
  • 打赏
  • 举报
回复
谢谢回复。 而你没有进行判断a和b的大小直接返回,所以你返回1时数组的顺序是不变的,返回-1时数组是逆序的 对这里不理解。。。这里我确实没有判断直接返回的,为什么返回1数组的顺序是不变的呢?
  • 打赏
  • 举报
回复
compare的返回值有三种情况,正数,零,负数。当返回值为正数时,表示左值(a)大于右值(b),会进行升序排序;当返回值为负数时,表示左值小于右值,会进行降序排序。而你没有进行判断a和b的大小直接返回,所以你返回1时数组的顺序是不变的,返回-1时数组是逆序的。因此你要想升序数组,你得这样写。
 Comparator<Integer> mycmp =new Comparator<Integer>() {
public int compare(Integer a, Integer b) {
return a > b ? 1 : -1;
}
};

想要降序这样写。
 Comparator<Integer> mycmp =new Comparator<Integer>() {
public int compare(Integer a, Integer b) {
return a < b ? 1 : -1;
}
};
whuyotc 2020-06-25
  • 打赏
  • 举报
回复
我不是想排序。 我只是想测试一下,如果直接返回会有什么效果。。。
Bigdata-Page 2020-06-25
  • 打赏
  • 举报
回复
你是要排序? 不要直接返回值, 返回a>b就好

62,614

社区成员

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

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