问题描述
- 还是 关于comparetor 的问题, 为什么返回1 就是正序,返回-1就是逆序呢?
- ArrayList list = new ArrayList();
list.add(100); list.add(22); list.add(77); list.add(44); list.add(55); System.out.println(list); Collections.sort(list new Comparator<Integer>() { @Override public int compare(Integer num1 Integer num2) { return num1>num2?1:-1; } }); System.out.println(list);}
我们假设 num1 = 100 num2 = 22. 那么 num1>num2 返回的是1 . 然后呢? 不太明白 。 能帮忙细讲解 一下么。。一步一步的,,
解决方案
无论正序,还是逆序,你首先要排序吧。排序的过程在哪里?是 Collections.sort 实现的吗?
compare 现在只是实现,要看调用处如何调用,参数是如何传入的才能进一步分析。
解决方案二:
Collections.sort 本身实现了排序功能,compare是用来比较大小的,就是你排序时的顺序
解决方案三:
public int compare(Integer num1 Integer num2) { return num1>num2?1:-1; }
第一个参数大于第二个参数时返回1
否则(第一个参数小于或等于第二个参数时返回-1
解决方案四:
这个没有什么好解释的,这个相当于一个规定,大于0的就是指compare方法第一个参数要放在第二个参数的前面,小于0就是指第一个参数要放在第二个参数后面
解决方案五:
非要追问为什么的话,其实是历史原因,曾经有几个C函数,他们就是这样区分大小的:
int strcmp(const char *s1 const char *s2);
int memcmp(const void *s1 const void *s2 size_t n);
解决方案六:
Comparator的是根据二叉树进行排序,并且是根据中序进行遍历的。
num1>num2?1:-1; 这个是三元运算符(具体可以了解下Java基础),如果num1 > num2 则返回1,那么num1是右节点,num2是左节点,中序遍历后,那么compartor就是是按照num从小到大的顺序排列;
反之,num1>num2?-1:1则是如何num1 > num2 则返回-1,num1是左节点,num2是右节点,中序遍历后,那么compartor就是是按照num从大到小的顺序排列;