服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - 深入浅出讲解Java比较器及数学常用类

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

2021-12-30 00:40威斯布鲁克.猩猩 Java教程

这篇文章主要介绍了深入浅出讲解Java比较器及数学常用类,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

背景:Java中的对象,正常情况下,只能进行比较:== 或 !=。不能使用 > 或 < ;但是在开发场景中,我们需要对多个对象进行排序,言外之意,就需要比较对象的大小。如何实现?使用两个接口中的任何一个:Comparable 或 Comparator

方式一:自然排序: java . lang . Comparable

> Comparable 接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序。
> 实现 Comparable 的类必须实现 compareTo ( Object obj )方法,两个对像即通 过 compareTo ( Object obj )方法的返回債来比较大小。如果当前对象 this 大于形参对象 obj ,则返 回正整数,如果当前对象 this 小于形参对象 obj ,则返回负整数,如果当前对象 this 等于形参对 象 obj ,则返回零。
> 实现 Comparable 接口的对象列表(和数组)可以通过 Collections . sort 或 Arrays . sort 进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。
> 对于类 C 的每一个e1和e2来说,当且仅当e1.compareTo(e2)==0与e1.equals(e2)具有相同 的 boolean 值时,类 C 的自然排序才叫做与 equals 一致。建议(虽然不是必需的)最好使自然排 序与 equals 一致。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/*
   Comparable接口的使用举例:自然排序
   1.像String、包装类等实现了Compareable接口,重写了compareTo(obj)方法,给出了比较两个对象大小的方式
   2.像String、包装类重写compareTo()方法以后,进行了从小到大的排列
   3.重写compareTo(obj)的规则:
     如果当前对象this大于形参对象obj,则返回正整数
     如果当前对象this小于形参对象obj,则返回负整数
     如果当前对象this等于形参对象obj,则返回零
   4.对于自定义类来说,如果需要排序,我们可以让自定义类实现Comparable接口,重写compareTo(obj)方法
     在compareTo(obj)方法中指明如何排序
    */
   @Test
   public void test1(){
       String[] arr = new String[]{"AA","CC","KK","MM","GG","JJ","DD"};
       Arrays.sort(arr);
       System.out.println(Arrays.toString(arr));//[AA, CC, DD, GG, JJ, KK, MM]
   }
   @Test
   public void test2(){
       Goods[] arr = new Goods[5];
       arr[0] = new Goods("lenovoMouse",34);
       arr[1] = new Goods("dellMouse",43);
       arr[2] = new Goods("miMouse",12);
       arr[3] = new Goods("huaweiMouse",65);
       arr[4] = new Goods("microsoftMouse",43);
       Arrays.sort(arr);
       System.out.println(Arrays.toString(arr));
   }

方式二:定制排序: java . util . Comparator

> 当元素的类型没有实现 java . lang . Comparable 接口而又不方便修改代码,或者实现 了 java . lang . Comparable 接口的排序规则不适合当前的操作,那么可以考虑使 用 Comparator 的 对象来排序,强行对多个对象进行整体排序的比较。
> 重写 compare ( Object o1, Object o2)方法,比较o1和o2的大小:如果方法回正整数,则表示o1大 于o2;如果返回0,表示相等;返回负整数,表示o1小于o2。
> 可以将 Comparator 传递给 sort 方法(如 Collections . sort 或 Arrays . sort )从而允许在排序顺 序上实现精确控制。
> 还可以使用 Comparator 来控制某些数据结构(如有序 set 或有序映射)的顺序,或者为那些没有 自然顺序的对象 colection 提供排序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/*
   Comparator接口的使用:定制排序
   1.背景:
   当元素的类型没有实现java.long.Comparable接口而又不方便修改代码,或者实现了java.long.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);//加-表示:从小到大排列-->从大到小
               }
               throw new RuntimeException("输入的数据类型不一致!");
           }
       });
       System.out.println(Arrays.toString(arr));//[MM, KK, JJ, GG, DD, CC, AA]
   }
   @Test
   public void test4(){
       Goods[] arr = new Goods[5];
       arr[0] = new Goods("lenovoMouse",34);
       arr[1] = new Goods("dellMouse",43);
       arr[2] = new Goods("miMouse",12);
       arr[3] = new Goods("huaweiMouse",65);
       arr[4] = 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));
   }

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

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

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

到此这篇关于深入浅出讲解Java比较器及数学常用类的文章就介绍到这了,更多相关Java 比较器及数学常用类内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_49329785/article/details/119581000

延伸 · 阅读

精彩推荐
  • Java教程Java BufferWriter写文件写不进去或缺失数据的解决

    Java BufferWriter写文件写不进去或缺失数据的解决

    这篇文章主要介绍了Java BufferWriter写文件写不进去或缺失数据的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java实现抢红包功能

    Java实现抢红包功能

    这篇文章主要为大家详细介绍了Java实现抢红包功能,采用多线程模拟多人同时抢红包,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    这篇文章主要介绍了Java使用SAX解析xml的示例,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程xml与Java对象的转换详解

    xml与Java对象的转换详解

    这篇文章主要介绍了xml与Java对象的转换详解的相关资料,需要的朋友可以参考下...

    Java教程网2942020-09-17
  • Java教程小米推送Java代码

    小米推送Java代码

    今天小编就为大家分享一篇关于小米推送Java代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    富贵稳中求8032021-07-12
  • Java教程Java8中Stream使用的一个注意事项

    Java8中Stream使用的一个注意事项

    最近在工作中发现了对于集合操作转换的神器,java8新特性 stream,但在使用中遇到了一个非常重要的注意点,所以这篇文章主要给大家介绍了关于Java8中S...

    阿杜7482021-02-04
  • Java教程20个非常实用的Java程序代码片段

    20个非常实用的Java程序代码片段

    这篇文章主要为大家分享了20个非常实用的Java程序片段,对java开发项目有所帮助,感兴趣的小伙伴们可以参考一下 ...

    lijiao5352020-04-06
  • Java教程升级IDEA后Lombok不能使用的解决方法

    升级IDEA后Lombok不能使用的解决方法

    最近看到提示IDEA提示升级,寻思已经有好久没有升过级了。升级完毕重启之后,突然发现好多错误,本文就来介绍一下如何解决,感兴趣的可以了解一下...

    程序猿DD9332021-10-08