HelloCoder HelloCoder
首页
《Java小白求职之路》
《小白学Java》
计算机毕设
  • 一些免费计算机资源
  • 脚手架工具
  • 《从0到1学习Java多线程》
  • 《从0到1搭建服务器》
  • 《可观测和监控》
随笔
关于作者
首页
《Java小白求职之路》
《小白学Java》
计算机毕设
  • 一些免费计算机资源
  • 脚手架工具
  • 《从0到1学习Java多线程》
  • 《从0到1搭建服务器》
  • 《可观测和监控》
随笔
关于作者
  • 《PureJavaCoderRoad》

    • 导读

    • Java基础

    • Java进阶

      • 常用类

      • 集合

        • Comparable接口
        • Deque
        • HashCode和equals
        • Iterator与Collection
        • List
        • Map
        • Queue
        • Set
        • Stack
        • 集合类的介绍
      • 反射

      • IO

      • Java新特性

      • 序列化与反序列
      • 泛型
    • Java高阶

    • 开发辅助工具

    • 计算机网络

    • 数据库

    • JavaEE

    • 中间件

    • 架构

    • 建议

  • PureJavaCoderRoad
  • Java进阶
  • 集合
#Comparable #接口
码农阿雨
2022-05-26
目录

Comparable接口

# 1、Comparable

Java提供了一个Comparable接口,该接口里定义了一个compareTo(Object obj)方法,该方法返回一个整数值,实现该接口的类必须实现该方法,实现了该接口的类必须实现该方法,实现接口的类就可以比较大小了。

当调用一个一个对象调用该方法与另一个对象进行比较时,obj1.compareTo(obj2)如果返回0表示两个对象相等;如果返回正整数则表明obj1大于obj2,如果是负整数则相反。

可以看到Comparable接口只有一个方法:

public int compareTo(T o);

# 2、Comparable有什么作用?

举个例子,

String[] strArr = {"A","B","C","E","D"};
Arrays.sort(strArr);
for (String string : strArr) {
    System.out.print(string+";");
}

输出结果:

A;B;C;D;E;

从中我们可以看出sort方法对数据中的String字符串按照一定规则进行了排序,那为什么会排序呢?

看一下String类的源码:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {

它也实现了Comparable接口。里面实现了compareTo方法,所以按照某种规则能够进行排序。

如果我要对自己的对象进行排序,那要怎么操作呢?

这样写?

Student xiaoha = new Student("小哈", 20);
Student erha = new Student("二哈", 19);
Student daha = new Student("大哈", 25);
Student[] studentArray = new Student[]{xiaoha, erha, daha};
Arrays.sort(studentArray);
for (Student student : studentArray) {
    System.out.println(student);
}

执行发现:

Exception in thread "main" java.lang.ClassCastException: com.yudianxx.basic.集合.ComparableTest$Student cannot be cast to java.lang.Comparable
	at java.util.ComparableTimSort.countRunAndMakeAscending(ComparableTimSort.java:320)
	at java.util.ComparableTimSort.sort(ComparableTimSort.java:188)
	at java.util.Arrays.sort(Arrays.java:1246)
	at com.yudianxx.basic.集合.ComparableTest.main(ComparableTest.java:45)

提示 Student 这个类无法 转换为Comparable,其实根本原因是因为没有实现自己的比较方法规则(compareTo()方法)。

而String 类 是重写了compareTo()方法的比较规则的。

# 3、自定义排序Array数组

# 1、实现Comparable接口,重写compareTo方法

完整例子:

public class ComparableTest {
    public static void main(String[] args) {
        Student xiaoha = new Student("小哈", 20);
        Student erha = new Student("二哈", 19);
        Student daha = new Student("大哈", 25);
        Student[] studentArray = new Student[]{xiaoha, erha, daha};
        Arrays.sort(studentArray);
        for (Student student : studentArray) {
            System.out.println(student);
        }
        
    }
    //实现Comparable 接口 
    static class Student implements Comparable<Student> {
        String name;
        Integer age;

        Student(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public Integer getAge() {
            return age;
        }

        @Override
        public int compareTo(Student o2) {
            //降序
            return this.getAge().compareTo(o2.getAge());
        }

        @Override
        public String toString() {
            return "Car{" +
                    "名字='" + name + '\'' +
                    ", 年龄=" + age +
                    '}';
        }
    }
}

输出:

Car{名字='二哈', 年龄=19}
Car{名字='小哈', 年龄=20}
Car{名字='大哈', 年龄=25}

这样就能达到按照年龄升序的排列方式了。

# 2、实现sortComparator接口,重写compare方法

public class ComparatorTest {

    static class Student {
        String name;
        Integer age;

        Student(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public Integer getAge() {
            return age;
        }

        @Override
        public String toString() {
            return "Car{" +
                    "名字='" + name + '\'' +
                    ", 年龄=" + age +
                    '}';
        }
    }

    static class SortComparator implements Comparator<Student> {
        @Override
        public int compare(Student o1, Student o2) {
            //降序
            return o2.getAge().compareTo(o1.getAge());
        }
    }

    public static void main(String[] args) {
        Student xiaoha = new Student("小哈", 20);
        Student erha = new Student("二哈", 19);
        Student daha = new Student("大哈", 25);
        Student[] studentArray = new Student[]{xiaoha, erha, daha};
        //传入实现接口Comparator 的类
        Arrays.sort(studentArray, new SortComparator());
        for (Student student : studentArray) {
            System.out.println(student);
        }
    }
}

输出:

Car{名字='二哈', 年龄=19}
Car{名字='小哈', 年龄=20}
Car{名字='大哈', 年龄=25}

可以看到,这里的SortComparator类就是自定义的排序规则。


# 4、自定义排序List列表

list 是有序的,默认按照add()的先后顺序遍历

假如没有自定义,是会按照add()的顺序先后遍历的。

eg:

List<Student> studentList = new ArrayList<>();
studentList.add(xiaoha);
studentList.add(erha);
studentList.add(daha);
System.out.println(studentList);

输出:

[Car{名字='小哈', 年龄=20}, Car{名字='二哈', 年龄=19}, Car{名字='大哈', 年龄=25}]

# List 自定义排序方法

可以声明 Collections.sort(studentList,new SortComparator()); 排序,即上面的自定义数组排序的第二种

List<Student> studentList = new ArrayList<>();
studentList.add(xiaoha);
studentList.add(erha);
studentList.add(daha);
System.out.println(studentList); //默认的排序
Collections.sort(studentList, new SortComparator()); //自定义排序
System.out.println(studentList);

输出:

[Car{名字='小哈', 年龄=20}, Car{名字='二哈', 年龄=19}, Car{名字='大哈', 年龄=25}]
[Car{名字='大哈', 年龄=25}, Car{名字='小哈', 年龄=20}, Car{名字='二哈', 年龄=19}]

# 语法糖:(建议使用这种)

如果是List列表,不一定要写的这么复杂的,可以写成这样:

public class ComparatorTest {
    static class Student {
        String name;
        Integer age;
            this.name = name;
            this.age = age;
        }
        public Integer getAge() {
            return age;
        }
        @Override
        public String toString() {
            return "Car{" +
                    "名字='" + name + '\'' +
                    ", 年龄=" + age +
                    '}';
        }
    }
    public static void main(String[] args) {
        Student xiaoha = new Student("小哈", 20);
        Student erha = new Student("二哈", 19);
        Student daha = new Student("大哈", 25);

        List<Student> studentList = new ArrayList<>();
        studentList.add(xiaoha);
        studentList.add(erha);
        studentList.add(daha);
        //核心
        Collections.sort(studentList, new Comparator<Student>() {
            @Override
            //降序
            public int compare(Student o1, Student o2) {
                return o2.getAge().compareTo(o1.getAge());
            }
        });
        System.out.println(studentList);
    }
}
阅读全文
×

(为防止恶意爬虫)
扫码或搜索:HelloCoder
发送:290992
即可永久解锁本站全部文章

解锁
#Comparable#接口
上次更新: 2025-09-05 07:09:03
最近更新
01
阿里面试题(答案)
09-05
02
《LeetCode 101》
09-05
03
《LeetCode CookBook》
09-05
更多文章>
Theme by Vdoing | Copyright © 2020-2025 码农阿雨
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式