数据结构与算法(Java篇)笔记--Comparable接口

简介: 数据结构与算法(Java篇)笔记--Comparable接口



前言

在我们的程序中,排序是非常常见的一种需求,提供一些数据元素,把这些数据元素按照一定的规则进行排序。比如查询一些订单,按照订单的日期进行排序;再比如查询一些商品,按照商品的价格进行排序等等。所以,接下来我们要学习一些常见的排序算法。

在java的开发工具包jdk中,已经给我们提供了很多数据结构与算法的实现,比如List,Set,Map,Math等等,都是以API的方式提供,这种方式的好处在于一次编写,多处使用。我们借鉴jdk的方式,也把算法封装到某个类中,那如果是这样,在我们写java代码之前,就需要先进行API的设计,设计好之后,再对这些API进行实现。


一、Comparable接口介绍

由于我们这里要讲排序,所以肯定会在元素之间进行比较,而Java提供了一个接口Comparable就是用来定义排序规则的,在这里我们以案例的形式对Comparable接口做一个简单的回顾。Comparable接口是用来实现对象的排序比较的一个接口,一般自定对象要实现按照一定规则进行排序(比如说要求按照升序或者是降序排列显示),那么可以让需要排序的对象的类去实现“Comparable”接口,然后覆写该接口的一个compareTol),排序的规则就是在该方法定义的。

二、接口使用

1.代码实现

1.定义一个学生类Student,具有年龄age和姓名username两个属性,并通过Comparable接口提供比较规则;

2.定义测试类Test,在测试类Test中定义测试方法Comparable getMax(Comparable c1,Comparable c2)完成测试

代码如下(示例):

实现Comparable的学生类

//学生类
public class Student implements Comparable<Student>{
    private String username;
    private int age;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student [age=" + age + ", username=" + username + "]";
    }
    @Override
    public int compareTo(Student o) {
        // TODO Auto-generated method stub  JAVA_TOOL_OPTIONS  -Dfile.encoding=UTF-8
        return this.getAge() - o.getAge();
    }
}

测试类

//测试类
public class TestComparable {
    
    public static void main(String[] args){
        Student s1 = new Student();
        s1.setUsername("CSH");
        s1.setAge(24);
        Student s2 = new Student();
        s2.setUsername("JMFive");
        s2.setAge(17);
      // 使用Comparable类<T>的类型
        Comparable<Student> max = getMax(s1, s2);
        System.out.println(max);
    }
    
  // 这里Student c1不能有Comparable c1,这样会有警告
    public static Comparable<Student> getMax(Student c1, Student c2){
        int result = c1.compareTo(c2);
        if(result>=0){
            return c1;
        }else{
            return c2;
        }
    }
}

2.运行结果

编写完成之后,点击运行就能根据要求比较都这两个对象的大小了,如下图所示:


总结

1、如果类的对象集合或者是数组要进行排序,则可以实现 Comparable 接口

2、其实上Arrays的sort方法中会调用我们覆写的compareTo方法,根据这个方法的返回值来确定哪一个对象在前面。

相关文章
|
17天前
|
Java
Java基础—笔记—static篇
`static`关键字用于声明静态变量和方法,在类加载时初始化,只有一份共享内存。静态变量可通过类名或对象访问,但推荐使用类名。静态方法无`this`,不能访问实例成员,常用于工具类。静态代码块在类加载时执行一次,用于初始化静态成员。
10 0
|
17天前
|
Java API 索引
Java基础—笔记—String篇
本文介绍了Java中的`String`类、包的管理和API文档的使用。包用于分类管理Java程序,同包下类无需导包,不同包需导入。使用API时,可按类名搜索、查看包、介绍、构造器和方法。方法命名能暗示其功能,注意参数和返回值。`String`创建有两种方式:双引号创建(常量池,共享)和构造器`new`(每次新建对象)。此外,列举了`String`的常用方法,如`length()`、`charAt()`、`equals()`、`substring()`等。
15 0
|
3天前
|
存储 安全 Java
[Java基础面试题] Map 接口相关
[Java基础面试题] Map 接口相关
|
9天前
|
Java 开发者
探索 Java 的函数式接口和 Lambda 表达式
【4月更文挑战第19天】Java 中的函数式接口和 Lambda 表达式提供了简洁、灵活的编程方式。函数式接口有且仅有一个抽象方法,用于与 Lambda(一种匿名函数语法)配合,简化代码并增强可读性。Lambda 表达式的优点在于其简洁性和灵活性,常用于事件处理、过滤和排序等场景。使用时注意兼容性和变量作用域,它们能提高代码效率和可维护性。
|
9天前
|
Java
Java接口中可以定义哪些方法?
【4月更文挑战第13天】
14 0
Java接口中可以定义哪些方法?
|
11天前
|
设计模式 Java
Java接口与抽象类
Java接口与抽象类
17 0
|
15天前
|
安全 Java 编译器
接口之美,内部之妙:深入解析Java的接口与内部类
接口之美,内部之妙:深入解析Java的接口与内部类
35 0
接口之美,内部之妙:深入解析Java的接口与内部类
|
17天前
|
Java API
Java基础—笔记—内部类、枚举、泛型篇
本文介绍了Java编程中的内部类、枚举和泛型概念。匿名内部类用于简化类的创建,常作为方法参数,其原理是生成一个隐含的子类。枚举用于表示有限的固定数量的值,常用于系统配置或switch语句中。泛型则用来在编译时增强类型安全性,接收特定数据类型,包括泛型类、泛型接口和泛型方法。
9 0
|
18天前
|
存储 Java
java接口和内部类
java接口和内部类
|
19天前
|
缓存 安全 Java
Java中函数式接口详解
Java 8引入函数式接口,支持函数式编程。这些接口有单一抽象方法,可与Lambda表达式结合,简化代码。常见函数式接口包括:`Function&lt;T, R&gt;`用于转换操作,`Predicate&lt;T&gt;`用于布尔判断,`Consumer&lt;T&gt;`用于消费输入,`Supplier&lt;T&gt;`用于无参生成结果。开发者也可自定义函数式接口。Lambda表达式使实现接口更简洁。注意异常处理和线程安全。函数式接口广泛应用于集合操作、并行编程和事件处理。提升代码可读性和效率,是现代Java开发的重要工具。
30 0