深入浅出讲解Java比较器及数学常用类

yizhihongxing

深入浅出讲解Java比较器及数学常用类

Java比较器

Java中的比较器是用于比较两个对象的大小关系的接口,它定义了一个compare()方法用于比较大小。常用于排序、查找等场景中。

自然排序

自然排序是Java中默认的排序方式,即根据对象所属类型的大小关系进行排序。例如,整数类型按照数值大小进行排序,字符串类型按照字典序进行排序。

public class Person implements Comparable<Person> {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public int compareTo(Person o) {
        return this.name.compareTo(o.getName());
    }
}

// 使用自然排序对Person对象数组进行排序
Person[] persons = new Person[] { new Person("Tom"), new Person("Jerry"), new Person("Alice") };
Arrays.sort(persons);
System.out.println(Arrays.toString(persons)); // [Alice, Jerry, Tom]

上例中,Person类实现了Comparable<Person>接口,并重写了其中的compareTo()方法。该方法根据name属性的大小关系进行比较,从而实现了以name属性进行自然排序。

定制排序

定制排序是指根据自定义的规则进行对象大小关系的比较。在Java中,我们可以通过实现Comparator<T>接口来实现定制排序。

public class Person {
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

// 根据Person对象的age属性进行定制排序
Comparator<Person> byAge = new Comparator<Person>() {
    @Override
    public int compare(Person o1, Person o2) {
        return Integer.compare(o1.getAge(), o2.getAge());
    }
};

// 使用定制排序对Person对象数组进行排序
Person[] persons = new Person[] { new Person("Tom", 20), new Person("Jerry", 18), new Person("Alice", 25) };
Arrays.sort(persons, byAge);
System.out.println(Arrays.toString(persons)); // [Jerry, Tom, Alice]

上例中,我们定义了一个匿名内部类实现了Comparator<Person>接口,并实现了compare()方法。该方法根据age属性的大小关系进行比较,从而实现了以age属性进行定制排序。

数学常用类

Java中提供了一些常用的数学类,用于完成数学计算,比如计算绝对值、幂、三角函数值等。这些常用的数学类主要包括以下几个:

Math类

Math类是Java中提供的数学类,它包含了各种数学计算方法,如取绝对值、幂、三角函数值等。

System.out.println(Math.abs(-5)); // 5

System.out.println(Math.pow(2, 3)); // 8.0

System.out.println(Math.sin(30)); // -0.9880316240928618

BigDecimal类

BigDecimal类是用于高精度计算的类,它可以避免精度丢失等问题。

BigDecimal bigDecimal1 = new BigDecimal("0.1");
BigDecimal bigDecimal2 = new BigDecimal("0.2");
BigDecimal result = bigDecimal1.add(bigDecimal2);
System.out.println(result); // 0.3

Random类

Random类用于生成伪随机数。它提供了两个构造方法:一个默认构造方法和一个接受种子的构造方法。

Random random = new Random();
System.out.println(random.nextInt(10)); //生成0到10之间的一个随机整数

Random random1 = new Random(100);
System.out.println(random1.nextInt(10)); //生成0到10之间的一个随机整数,其中的种子为100

示例说明

示例1

我们定义了一个表示学生的Student类,其中有学生姓名和学生成绩两个属性。我们需要对学生按照成绩进行排序,如果成绩相同,则按照姓名进行排序。

public class Student implements Comparable<Student> {
    private String name;
    private int score;

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

    public String getName() {
        return name;
    }

    public int getScore() {
        return score;
    }

    // 实现Comparable接口,自然排序
    @Override
    public int compareTo(Student o) {
        if (this.score != o.getScore()) {
            return this.score - o.getScore();
        }
        return this.name.compareTo(o.getName());
    }
}

// 对学生数组进行自然排序
Student[] students = new Student[] { new Student("Tom", 80), new Student("Jerry", 70),
            new Student("Alice", 80), new Student("Bob", 90) };
Arrays.sort(students);
System.out.println(Arrays.toString(students));

上例中,我们定义了一个Student类,其中实现了Comparable<Student>接口,重写了其中的compareTo()方法。该方法首先按照score属性的大小进行比较,如果相同,则继续按照name属性进行比较,从而实现了对学生对象的自然排序。

示例2

我们需要生成一个1到10之间的随机整数。

Random random = new Random();
int num = random.nextInt(10) + 1;
System.out.println(num);

上例中,我们使用Random类生成一个随机整数,并加1后输出。这样我们就得到了一个1到10之间的随机整数。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入浅出讲解Java比较器及数学常用类 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • MySQL中查询json格式的字段实例详解

    MySQL中查询json格式的字段需要使用JSON函数。此处介绍几个常用的MySQL JSON函数。 JSON_EXTRACT JSON_EXTRACT可以用来提取json中的某个值,其语法如下: JSON_EXTRACT(json_obj, path) 其中,json_obj表示json对象,path表示要提取的值的路径。路径可以是简单的key或者是嵌套的…

    C 2023年5月23日
    00
  • C++智能指针模板应用详细介绍

    C++智能指针模板应用详细介绍 智能指针的概念 在C++中,当我们使用new创建了一个对象时,需要手动的调用delete来释放内存。但是,如果在某个地方忘记释放内存,就会导致内存泄漏问题。为了避免这个问题,我们可以使用智能指针来管理内存。 一个智能指针是一个类,它行为像一个指针,但它还额外提供了内存管理的功能。智能指针类会通过在构造函数中调用new和在析构函…

    C 2023年5月22日
    00
  • C语言教程之数组详解

    C语言教程之数组详解 数组概述 数组是一组相同类型数据的集合,它们按照一定的先后顺序排列,每个数组元素可以通过一个下标访问。 在C语言中,数组元素是按照线性顺序存储在内存中的,数组下标从0开始,可以是整数、字符、枚举类型。 声明数组 在C语言中,可以使用以下方式来声明数组: type arrayName[arraySize]; 其中type为数组元素类型,a…

    C 2023年5月23日
    00
  • python 提取key 为中文的json 串方法

    提取key为中文的JSON串的方法,可以利用Python的json模块和正则表达式实现。具体步骤如下: 步骤一:读取JSON文件 首先,使用Python中的open函数来读取JSON文件,并使用json.load函数将文件内容加载为JSON对象。示例代码如下: import json with open(‘data.json’, ‘r’, encoding=…

    C 2023年5月23日
    00
  • 基于C语言实现学生管理系统

    “基于C语言实现学生管理系统”攻略 1. 需求分析 在开发学生管理系统前,需要对需求进行分析,基本功能包括添加学生信息、查询学生信息、删除学生信息、修改学生信息。在此基础上,还可以增加更多功能,如按成绩排序、导出学生信息等。 2. 数据结构设计 学生信息需要被存储,通常采用结构体的方式来组织数据。结构体可以定义多个数据类型,方便程序处理。 以下为示例代码: …

    C 2023年5月23日
    00
  • C++隐式类型转换运算符operator type()用法详解

    C++隐式类型转换运算符operator type()用法详解 隐式类型转换是 C++ 一个重要的特性,在某些情况下可以简化代码并方便编程。其中,使用 operator type() 运算符可以指定自定义类型转换规则。本文将详细讲解该运算符的用法。 语法 operator type() { /* … */ } 其中,type 指定了你希望将自定义类型转换…

    C 2023年5月22日
    00
  • C 语言基础教程(我的C之旅开始了)[九]

    那么让我们来详细讲解“C 语言基础教程(我的C之旅开始了)[九]”吧。 标题 本文的标题是“C 语言基础教程(我的C之旅开始了)[九]”。 代码块 本篇文章中会使用到多个代码块,代码块应该使用“`进行标注,并标明代码块中的语言,如下所示: #include <stdio.h> int main() { printf("Hello, W…

    C 2023年5月23日
    00
  • C++你最好不要做的几点小结

    以下是“C++你最好不要做的几点小结”的完整攻略。 C++你最好不要做的几点小结 1. 不要忘记初始化 C++中未初始化的变量是具有未定义值的,如果试图使用未初始化的变量,将会导致不可预知的结果。因此,在使用变量之前,一定要初始化。对于内建类型,可以使用默认值进行初始化,例如: int a = 0; // 将a初始化为0 bool b = false; //…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部