Java ---比较器

这篇具有很好参考价值的文章主要介绍了Java ---比较器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

      我们知道基本数据类型的数据(除 boolean 类型外)需要比较大小的话,之间使用比较运算符即可,但是引用数据类型是不能直接使用比较运算符来比较大小的。那么,如何解决这个问题呢?
     在 Java 中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题。
Java 实现对象排序的方式有两种:
自然排序:java.lang.Comparable
定制排序:java.util.Comparator

(一)自然排序 java.lang.Comparable 

    Comparable 接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序。
     实现 Comparable 的类必须实现 compareTo(Object obj) 方法,两个对象即通过 compare
To(Object obj) 方法的返回值来比较大小。如果当前对象 this 大于形参对象 obj,则返回正整数,如果当前对象 this 小于形参对象 obj,则返回负整数,如果当前对象 this 等于形参对象 obj,则返回零。

 代码:

package java.lang;
public interface Comparable{
 int compareTo(Object obj);
}
    实现 Comparable 接口的对象列表(和数组)可以通过 Collections.sort 或 Arrays.sort 进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中 的元素,无需指定比较器。
    对于类 C 的每一个 e1 和 e2 来说,当且仅当 e1.compareTo(e2) == 0 与 e1.equals(e2) 具有相同的 boolean 值时,类 C 的自然排序才叫做与 equals 一致。
             建议(虽然不是必需的) 最好使自然排序与 equals 一致
Comparable 的典型实现:( 默认都是从小到大排列的 )
String:按照字符串中字符的 Unicode 值进行比较
Character:按照字符的 Unicode 值来进行比较
数值类型对应的包装类以及 BigInteger、BigDecimal:按照它们对应的数值
大小进行比较
Boolean:true 对应的包装类实例大于 false 对应的包装类实例
Date、Time 等:后面的日期时间比前面的日期时间大
代码:
package com.atguigu.api;
public class Student implements Comparable {
 private int id;
 private String name;
 private int score;
 private int age;
 public Student(int id, String name, int score, int age) {
 this.id = id;
 this.name = name;
 this.score = score;
 this.age = age;
 }
 public int getId() {
 return id;
 }
 public void setId(int id) {
 this.id = id;
 }
 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
 public int getScore() {
 return score;
 }
 public void setScore(int score) {
 this.score = score;
 }
 public int getAge() {
 return age;
 }
 public void setAge(int age) {
 this.age = age;
 }
 @Override
 public String toString() {
 return "Student{" +
 "id=" + id +
 ", name='" + name + '\'' +
 ", score=" + score +
 ", age=" + age +
 '}';
 }
 @Override
 public int compareTo(Object o) {
 //这些需要强制,将 o 对象向下转型为 Student 类型的变量,才能调用 Stu
dent 类中的属性
 //默认按照学号比较大小
 Student stu = (Student) o;
 return this.id - stu.id;
 }
}

测试类:

package com.atguigu.api;
public class TestStudent {
 public static void main(String[] args) {
 Student[] arr = new Student[5];
 arr[0] = new Student(3,"张三",90,23);
 arr[1] = new Student(1,"熊大",100,22);
 arr[2] = new Student(5,"王五",75,25);
 arr[3] = new Student(4,"李四",85,24);
 arr[4] = new Student(2,"熊二",85,18);
 //单独比较两个对象
 System.out.println(arr[0].compareTo(arr[1]));
 System.out.println(arr[1].compareTo(arr[2]));
 System.out.println(arr[2].compareTo(arr[2]));
 System.out.println("所有学生:");
 for (int i = 0; i < arr.length; i++) {
 System.out.println(arr[i]);
 }
 System.out.println("按照学号排序:");
 for (int i = 1; i < arr.length; i++) {
 for (int j = 0; j < arr.length-i; j++) {
 if(arr[j].compareTo(arr[j+1])>0){
 Student temp = arr[j];
 arr[j] = arr[j+1];
 arr[j+1] = temp;
 }
 }
 }
 for (int i = 0; i < arr.length; i++) {
 System.out.println(arr[i]);
 }
 }
}

(二)定制排序:java.util.Comparator

 

          当元素的类型没有实现 java.lang.Comparable 接口而又不方便修改代码
(例如:一些第三方的类,你只有.class 文件,没有源文件)
 
        如果一个类,实现了 Comparable 接口,也指定了两个对象的比较大小的 规则,但是此时此刻我不想按照它预定义的方法比较大小,但是我又不能 随意修改,因为会影响其他地方的使用,怎么办?
       JDK 在设计类库之初,也考虑到这种情况,所以又增加了一个 java.util.Comparator 接口。强行对多个对象进行整体排序的比较。
        重写 compare(Object o1,Object o2)方法,比较 o1 和 o2 的大小:如果方法 返回正整数,则表示 o1 大于 o2;如果返回 0,表示相等;返回负整数,表示 o1 小于 o2。
   
  可以将 Comparator 传递给 sort 方法(如 Collections.sort 或
Arrays.sort),从而允许在排序顺序上实现精确控制。
代码:
package java.util;
public interface Comparator{
 int compare(Object o1,Object o2);
}

具体代码:

package com.atguigu.api;
import java.util.Comparator;
//定义定制比较器类
public class StudentScoreComparator implements Comparator {
 @Override
 public int compare(Object o1, Object o2) {
 Student s1 = (Student) o1;
 Student s2 = (Student) o2;
 int result = s1.getScore() - s2.getScore();
 return result != 0 ? result : s1.getId() - s2.getId();
 }
}

测试类:文章来源地址https://www.toymoban.com/news/detail-438582.html

package com.atguigu.api;
public class TestStudent {
 public static void main(String[] args) {
 Student[] arr = new Student[5];
 arr[0] = new Student(3, "张三", 90, 23);
 arr[1] = new Student(1, "熊大", 100, 22);
 arr[2] = new Student(5, "王五", 75, 25);
 arr[3] = new Student(4, "李四", 85, 24);
 arr[4] = new Student(2, "熊二", 85, 18);
 System.out.println("所有学生:");
 for (int i = 0; i < arr.length; i++) {
 System.out.println(arr[i]);
 }
 System.out.println("按照成绩排序");
 StudentScoreComparator sc = new StudentScoreComparator();
 for (int i = 1; i < arr.length; i++) {
 for (int j = 0; j < arr.length - i; j++) {
 if (sc.compare(arr[j], arr[j + 1]) > 0) {
 Student temp = arr[j];
 arr[j] = arr[j + 1];
 arr[j + 1] = temp;
 }
 }
 }
 for (int i = 0; i < arr.length; i++) {
 System.out.println(arr[i]);
 }
 }
}

到了这里,关于Java ---比较器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java入门8(Comparator比较器,HashMap)

    ​Comparator不同于Comparable,使用更加的灵活,可以在不同场景下使用比较器,实际开发中,更推荐comparator比较器 Set接口常用实现类 三个常用实现类:TreeSet(基于Java红黑树,底层map),HashSet(哈希表,底层map),LinkedHashSet() Set特点: 不允许存储重复元素 没有索引,不能

    2024年02月04日
    浏览(30)
  • java自然排序Comparable和比较器排序Comparator

    案例需求 存储学生对象并遍历,创建TreeSet集合使用无参构造方法 要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序 实现步骤 使用空参构造创建TreeSet集合 用TreeSet集合存储自定义对象,无参构造方法使用的是自然排序对元素进行排序的 自定义的Student类实

    2024年02月07日
    浏览(72)
  • 使用java.lang.Comparable实现比较器和使用java.util.Collections排序

    记录 :469 场景 :使用java.lang.Comparable实现比较器,使用java.util.Collections排序,实现找出最大值。 版本 :JDK 1.8,Spring Boot 2.6.3,fastjson-2.0.33。 1.一个JSON字符串,找出最大值 1.1JSON字符串 1.2解析 把JSON字符串转换是JSONArray类型,把值取出转换为独立对象,再做比较。 2.使用java.

    2024年02月15日
    浏览(30)
  • 数字电路基础(四) 数据分配器、数据选择器和数值比较器

    在数据传输的过程中,数据选择器可以把某一路的数据分配到不同的数据通道上,这种电路称为数据分配器。简称DEMUX,一般有已鞥输入和多个输出。如下图所示是一个四路数据选择器的芯片集成图: 它可以将D送到数据变量选择的通道,下图是数据选择器的真值表: 可以看

    2024年02月05日
    浏览(36)
  • 认识比较器

    Java中比较器是排序、加入有序数组等操作的时候必须要有的,没有的话会报错,例如下面这段代码: 运行时会发生下面的异常 Exception in thread \\\"main\\\" java.lang.ClassCastException: dataStructure.heap.Student cannot be cast to java.lang.Comparable     at java.util.ComparableTimSort.countRunAndMakeAscending(Compar

    2023年04月25日
    浏览(37)
  • 8.2 电压比较器(1)

    电压比较器是对输入信号进行鉴幅与比较的电路,是组成非正弦波发生电路的基本单元电路,在测量和控制中有着相当广泛的应用。 1、电压比较器的电压传输特性 电压比较器的输出电压 u O u_{scriptscriptstyle O} u O ​ 与输入电压 u I u_{scriptscriptstyle I} u I ​ 的函数关系 u O = f

    2024年02月11日
    浏览(35)
  • 一位比较器【模电实验】

    一位比较器,数值比较器的作用和原理是什么? 一、数值比较器的定义及功能 在数字系统中,特别是在计算机中都具有运算功能,一种简单的运算就是比较两个数A和B的大小。数值比较器就是对两数A、B进行比较,以判断其大小的逻辑电路。比较结果有A>B、A<B以及

    2024年02月05日
    浏览(50)
  • LM393电压比较器介绍

    概述       LM393 是双电压比较器集成电路。主要应用在脉冲发生器、模数转换器、限幅器、数字逻辑门电路、电压比较电路等场合。LM393电压比较器能直接连接TTL和CMOS电平电路。 特点 1、工作温度范围:0℃ --- +70℃; 2、工作电源电压范围宽,单电源、双电源均可工作:    

    2024年02月03日
    浏览(53)
  • Verilog | 4位数值比较器

    牛客上的一道题,记录一下 这道题有两种思路: 第一种是按位比较,列举出所有情况: 第二种方法是,使用同或的方式获取一个标志位,进而获得判断依据: 关于比较器还有另外一道题 问题描述 给定8个数,以及若干二输入的比较器(可以将两个输入排序)。要求在单周期

    2024年02月11日
    浏览(24)
  • LM324电压比较器介绍

    LM324 电压比较器简介       LM324 是单电源四路运算放大器,是一个具有差分输入和单端输出的高增益电压放大器。与在单电源应用场合的标准运算放大器比起来,其优点更明显。该四路放大器可以工作于低至3.0 V或高达32 V的电源电压,静态电流是MC1741的五分之一左右(每个放

    2024年02月06日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包