21-04-07比较器,System,Math,BigInteger与BigDecimal

这篇博客介绍了Java中对象排序的两种方式:Comparable接口的自然排序和Comparator接口的定制排序。通过示例展示了如何在自定义类中实现这两个接口以进行对象比较。此外,还讲解了System类的常用方法,如currentTimeMillis()、exit()和gc()。同时,讨论了Math类的数学运算方法和BigInteger、BigDecimal类在高精度计算中的应用。


)

比较器

说明:Java中的对象,正常情况下,只能进行比较:== 或 != 。不能使用 > 或 < 的

  •      但是在开发场景中,我们需要对多个对象进行排序,即需要比较对象的大小。
    
  •      使用两个接口中的任何一个:Comparable 或 Comparato
    

Comparable接口:自然排序

  1. 像String、包装类等实现了Comparable接口,重写了compareTo(obj)方法,给出了比较两个对象大小的方式。
  2. 像String、包装类重写compareTo()方法以后,进行了从小到大的排列
String[] arr = new String[]{"AA","CC","KK","MM","GG","JJ","DD"};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
  1. 重写compareTo(obj)的规则:
    如果当前对象this大于形参对象obj,则返回正整数,
    如果当前对象this小于形参对象obj,则返回负整数,
    如果当前对象this等于形参对象obj,则返回零。

  2. 对于自定义类来说,如果需要排序,我们可以让自定义类实现Comparable接口,重写compareTo(obj)方法。
    在compareTo(obj)方法中指明如何排序

public class CompareTest {
    public static void main(String[] args) {
//        String[] arr = new String[]{"AA", "CC", "KK", "MM", "GG", "JJ", "DD"};
//        Arrays.sort(arr);
//        System.out.println(Arrays.toString(arr));

        Food[] f = new Food[5];
        f[0] = new Food(15,"hanbao");
        f[1] = new Food(12,"kele");
        f[2] = new Food(16,"niurou");
        f[3] = new Food(158,"zhurou");
        f[4] = new Food(5,"bingan");

        Arrays.sort(f);
        System.out.println(Arrays.toString(f));

    }
}


 class Food implements Comparable {
    double price;
    String name;

    public Food(double price, String name) {
        this.price = price;
        this.name = name;
    }

    @Override
    public int compareTo(Object o) {
        if (o instanceof Food) {
            Food food = (Food) o;
            if (this.price > food.price) {
                return 1;
            }else if(this.price < food.price){
                return -1;
            }else {
                return -this.name.compareTo(food.name);
            }
            //方式二:
//            return Double.compare(this.price,food.price);
        }
        throw new  RuntimeException("传入的数据不一致!");
    }

     @Override
     public String toString() {
         return this.name +": "+ this.price;
     }
 }

Comparator接口的使用:定制排序

  1. 背景:
    当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码,
    或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,
    那么可以考虑使用 Comparator 的对象来排序
  2. 重写compare(Object o1,Object o2)方法,比较o1和o2的大小:
    如果方法返回正整数,则表示o1大于o2;
    如果返回0,表示相等;
    返回负整数,表示o1小于o2。
    @Test
    public void test3(){
        String[] arr = new String[]{"AA","CC","KK","MM","GG","JJ","DD"};
        Arrays.sort(arr,new Comparator(){

            //按照字符串从大到小的顺序排列
            @Override
            public int compare(Object o1, Object o2) {
                if(o1 instanceof String && o2 instanceof  String){
                    String s1 = (String) o1;
                    String s2 = (String) o2;
                    return -s1.compareTo(s2);
                }
//                return 0;
                throw new RuntimeException("输入的数据类型不一致");
            }
        });
        System.out.println(Arrays.toString(arr));
    }

    @Test
    public void test4(){
        Goods[] arr = new Goods[6];
        arr[0] = new Goods("lenovoMouse",34);
        arr[1] = new Goods("dellMouse",43);
        arr[2] = new Goods("xiaomiMouse",12);
        arr[3] = new Goods("huaweiMouse",65);
        arr[4] = new Goods("huaweiMouse",224);
        arr[5] = new Goods("microsoftMouse",43);

        Arrays.sort(arr, new Comparator() {
            //指明商品比较大小的方式:按照产品名称从低到高排序,再按照价格从高到低排序
            @Override
            public int compare(Object o1, Object o2) {
                if(o1 instanceof Goods && o2 instanceof Goods){
                    Goods g1 = (Goods)o1;
                    Goods g2 = (Goods)o2;
                    if(g1.getName().equals(g2.getName())){
                        return -Double.compare(g1.getPrice(),g2.getPrice());
                    }else{
                        return g1.getName().compareTo(g2.getName());
                    }
                }
                throw new RuntimeException("输入的数据类型不一致");
            }
        });

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

System类

  1. System类内部包含in、out和err三个成员变量,分别代表标准输入流(键盘输入),标准输出流(显示器)和标准错误输出流(显示器)

  2. native long currentTimeMillis()

该方法的作用是返回当前的计算机时间,时间的表达格式为当前计算机时

间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数。

  1. void exit(int status)

该方法的作用是退出程序。其中status的值为0代表正常退出,非零代表

异常退出。使用该方法可以在图形界面编程中实现程序的退出功能等。

  1. void gc()

该方法的作用是请求系统进行垃圾回收。至于系统是否立刻回收,则

取决于系统中垃圾回收算法的实现以及系统执行时的情况。

  1. String getProperty(String key)

该方法的作用是获得系统中属性名为key的属性对应的值。系统中常见的属性名以及属性的作用如下表所示:

在这里插入图片描述

Math类

abs 绝对值

acos,asin,atan,cos,sin,tan 三角函数

sqrt 平方根

pow(double a,doble b) a的b幂

log 自然对数

exp e为底指数

max(double a,double b)

min(double a,double b)

random() 返回0.0到1.0的随机数

long round(double a) double型数据a转换为long型(四舍五入)

toDegrees(double angrad) 弧度—>角度

toRadians(double angdeg) **角度—>**弧度

BigInteger

java.math包的BigInteger****可以表示不可变的任意精度的整数。BigInteger 提供

所有 Java 的基本整数操作符的对应物,并提供 java.lang.Math 的所有相关方法。

另外,BigInteger 还提供以下运算:模算术、GCD 计算、质数测试、素数生成、位操作以及一些其他操作。

构造器

BigInteger(String val):根据字符串构建BigInteger对象

BigDecimal

  • 一般的Float类和Double类可以用来做科学计算或工程计算,但在商业计算中,要求数字精度比较高,故用到java.math.BigDecimal类。

  • BigDecimal类支持不可变的、任意精度的有符号十进制定点数。

  • 构造器

  1. public BigDecimal(double val)

  2. public BigDecimal(String val)

 @Test
    public void test2() {
        BigInteger bi = new BigInteger("1243324112234324324325235245346567657653");
        BigDecimal bd = new BigDecimal("12435.351");
        BigDecimal bd2 = new BigDecimal("11");
        System.out.println(bi);
//         System.out.println(bd.divide(bd2));
        System.out.println(bd.divide(bd2, BigDecimal.ROUND_HALF_UP));
        System.out.println(bd.divide(bd2, 25, BigDecimal.ROUND_HALF_UP));

    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值