compareTo 是如何sort的

来源:8-7 Leetcode上优先队列相关问题

慕慕641757

2018-06-10


@Override
public int compareTo(Freq another){
    if(this.freq < another.freq){
       // System.out.print("1:"+this.freq + " " + another.freq);
        return 1;

    } else if(this.freq > another.freq){
        //System.out.print("-1: this.freq is "+this.freq + " " + "another.freq is " + another.freq);
        return -1;

    } else{
        //xSystem.out.print("0:"+this.freq + " " + another.freq);
        return 0;
    }

}


写回答

1回答

liuyubobobo

2018-06-11

compareTo 不是一个排序算法。compareTo的作用是定义对于当前的类来说,什么是大,什么是小,也就是两个这个类对象之间如何进行比较。Java的sort方法要依赖于compareTo,因为只有知道两个对象之间如何进行比较,才可以进行排序。当然,如果你的排序对象是Java中的基本数据类型,或者标准库中的数据类型(如String),自己就不用写compareTo了,Java提供了默认的compareTo实现。但是如果你的排序对象是自定义类型,就需要写compareTo。


比如你设计的一个学生类,但是两个学生之间,如何定义它们的大小关系?如果没有这个大小关系,我们就不能把学生的对象进行排序(也不能把学生的对象存储在二分搜索树或者优先队列中)。对于两个学生类的对象,创建Student这个类,计算机不能自动帮你判断两个学生对象之间如何比较。你可能希望按照学生姓名的字符串顺序定义大小关系;可能根据学生的成绩定义大小关系;也可能根据学生的身高定义大小关系,等等等等。此时,你就需要在Student类中自定义compareTo方法,来定义,你希望你的Student对象如何定义大小关系,如何确定谁在前,谁在后。


在compareTo中,当前类对象如果比传入的类对象要小(或者说排的更靠前),则返回-1;要大(或者说排的更靠后),则返回1;要相等,则返回0。


在我的课程《算法与数据结构》提供的Java代码中,包含了我们自己写的排序算法是如何利用用户传来的类对象的compareTo进行排序的。比如最简单的选择排序算法,相应的代码可以参考这里:https://github.com/liuyubobobo/Play-with-Algorithms/blob/master/02-Sorting-Basic/Course%20Code%20(Java)/02-Selection-Sort-Using-Comparable/src/bobo/algo/SelectionSort.java


加油!:)

2
1
慕慕641757
非常感谢!
2018-06-11
共1条回复

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程