首页 > 其他分享 >自定义对象比较器,结果失真怎么办?

自定义对象比较器,结果失真怎么办?

时间:2024-01-27 14:57:42浏览次数:25  
标签:name 自定义 age 失真 height User Student new 怎么办

如果自定义对象比较器的结果失真,那么首先需要确认比较器的compare方法是否正确实现。在Java中,compare方法应该返回一个负整数、零或正整数,分别表示第一个参数小于、等于或大于第二个参数。

例如,如果我们正在比较两个Student对象,我们可能会根据他们的身高或年龄来排序。但是,如果我们的compare方法返回的是两个年龄的差值,那么当两个学生的年龄相差很大时(身高浮点数作差),结果可能会出现失真。这是因为Java的整数类型可能会溢出。

为了避免这种情况,我们可以使用Integer.compare方法来比较两个整数(Double.compare),而不是直接相减。这样可以避免溢出的问题,并且可以正确处理负数的情况。

点击查看代码
package com.itheima.javase;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Comparator;

public class Demo {
    public static void main(String[] args) {
        // 示例1:使用Arrays.sort对基本数据类型数组进行排序
        fun1();

        System.out.println();

        // 示例2:实现Comparable接口对自定义类(User)进行排序
        fun2();

        System.out.println();

        // 示例3:使用Comparator接口对自定义类(Student)进行排序
        fun3();
    }

    // 示例1:使用Arrays.sort对基本数据类型数组进行排序
    private static void fun1() {
        int[] arr1 = new int[]{9, 2, 8, 1, 5, 1};

        // 默认是升序
        Arrays.sort(arr1);

        System.out.println(Arrays.toString(arr1));
    }

    // 示例2:实现Comparable接口对自定义类(User)进行排序
    private static void fun2() {
        User[] users = new User[]{
                new User("张三", 172.8, 23),
                new User("李四", 156.8, 28),
                new User("王五", 192.2, 22),
                new User("赵六", 184.8, 25),
        };

        // 使用Arrays.sort默认的Comparable排序(按年龄降序)
        Arrays.sort(users);

        for (User user : users) {
            System.out.println(user);
        }
    }

    // 示例3:使用Comparator接口对自定义类(Student)进行排序
    private static void fun3() {
        Student[] students = new Student[]{
                new Student("张三", 172.8, 23),
                new Student("李四", 156.8, 28),
                new Student("王五", 192.2, 22),
                new Student("赵六", 184.8, 25),
        };

        // 使用Comparator接口进行排序(按身高升序)
        Arrays.sort(students, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                // 使用Double.compare比较浮点数
                return Double.compare(o1.getHeight(), o2.getHeight());
            }
        });

        for (Student student : students) {
            System.out.println(student);
        }
    }
}

class Student {
    private String name;
    private double height;
    private int age;

    public Student() {
    }

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

    // Getter and Setter methods

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

class User implements Comparable<User> {
    private String name;
    private double height;
    private int age;

    public User() {
    }

    public User(String name, double height, int age) {
        this.name = name;
        this.height = height;
        this.age = age;
    }

    // Getter and Setter methods

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

    // 实现Comparable接口的compareTo方法,按年龄降序排序
    @Override
    public int compareTo(User o) {
        return o.age - this.age;
    }
}

标签:name,自定义,age,失真,height,User,Student,new,怎么办
From: https://www.cnblogs.com/iflytek-aiit319102020329/p/17991412

相关文章

  • [经验] 涨奶有硬块吸不出来奶怎么办
    1、涨奶有硬块怎么办涨奶是新手妈妈都可能会遇到的问题,尤其是初生婴儿吃奶频繁,母乳未能完全排出时,乳腺就会产生未排出的乳汁积聚,形成涨奶。而涨奶有硬块的情况,则需要及时处理。妈妈要保持心情愉悦,避免过度孤独、情绪低落。当妈妈感受到涨奶时,可以通过按摩乳房的方式放松乳腺,帮助乳......
  • [word] word复制的内容不想粘贴,怎么办?
    在编辑word文档的过程中,有时候内容复制了,但反悔了不想粘贴,怎么办?只要清空剪贴板即可。1.在【开始】菜单中点击【剪贴板】组中的斜箭头......
  • [经验] 小孩夏天身上湿疹怎么办
    1、身上湿疹怎么办身上湿疹是一种常见的皮肤病,也被称为湿疹性皮炎。它的主要症状是皮肤变得红肿、瘙痒、起泡和渗出。这种疾病常常会影响到人的日常工作和生活质量,因此需要及时治疗。下面是一些身上湿疹的治疗方法:1.保持皮肤干燥湿疹是由于皮肤过度湿润和炎症引起的,所以保持皮肤干......
  • 企业计算机服务器中了mallox勒索病毒怎么办,mallox勒索病毒解密流程
    随着网络技术的不断发展,网络安全威胁无处不在,这给企业的正常生产生活带来了极大影响,因此,做好企业的运维工作至关重要。近日,云天数据恢复中心接到北京某连锁品牌酒店的求助,企业的计算机服务器中了mallox勒索病毒导致企业系统内的重要数据被加密,无法正常使用,严重影响了企业正常运行,经......
  • 计算机服务器中了halo勒索病毒怎么办,halo勒索病毒解密处理流程
    计算机技术的发展与应用为企业的生产生活提供了坚实基础,但同时也为网络安全威胁制造了有利条件。近期,网络上的勒索病毒非常嚣张,给企业的计算机服务器带来严重威胁。近日,云天数据恢复中心接到山东某制造公司的求助,企业的计算机服务器被halo勒索病毒攻击,导致系统所有数据被加密无法使......
  • 为了生成latex如何在sympy中自定义向量函数?适用于自定义类的latex生成。
    在sympy.printing.Printer的_print函数中可以看到一个hook,使得对于每一个类都会尝试寻找对应的_print_{class}函数来处理,因此我们只要利用好这个hook就可以为自定义类创建latex生成逻辑,我试图创建了一个_print_BoldUndefinedFunction函数,但发现它捕获不到(其实是因为BoldUndefinedF......
  • WPF,ListView中的Item自定义靠左还是靠右
    Item中有属性来决定是左还是右,难点在于如何将ItemTemplate扩充占满整个宽度,这样子当界面缩放的时候,Item靠左或靠右也能随着移动,其实主要是下面的代码,设置ListViewItem的HorizontalContentAlignment属性为Stretch,铺满整个宽度,示例代码如下:<ListViewx:Name="LvmqttMsg"Ba......
  • 记windows自定义bat脚本自启动
    自定义Windows启动脚本简化版在本指南中,我们将使用一个简化的批处理文件(.bat)来演示如何创建自定义的Windows启动脚本。以下是一个基本的模板,您只需根据需要在:begin部分添加您的代码。 @echooffif"%1"=="h"gotobeginrem获取脚本路径set"scriptPath=%~dp0"......
  • Flutter3 TV 一百行自定义实现 tabbar tabview 联动
    系统自带的tabbar焦点在TV端无法很好的使用使用card_swiper组件作为tabviewimport'package:card_swiper/card_swiper.dart';import'package:flutter/material.dart';voidmain()=>runApp(MyApp());classMyAppextendsStatefulWidget{constMyApp({su......
  • 华为云CCE Turbo:基于eBPF的用户自定义多粒度网络监控能力
    本文分享自华为云社区《华为云CCETurbo:基于eBPF的用户自定义多粒度网络监控能力》,作者:云容器大未来。基于eBPF的容器监控的兴起容器具有极致弹性、标准运行时、易于部署等优点,越来越多的客户选择使用容器来部署自己的服务,随着容器规模越来越大,容器间网络交互也越来越复杂。我们需......