34 java比较器

java比较器

java实现对象排序的方式有两种:

  • 自然排序:java.lang.Comparable

  • 定制排序:java.util.Comparator

 

自然排序:java.lang.Comparable

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

但是在开发场景中,我们需要对多个对象进行排序,言外之意,就需要比较对象的大小

如何实现? 使用两个接口中的任何一个: Comparable 或 Comparator

二、Comparable接口的使用

  1. 像String、包装类等实现了Comparable接口,重写了compareTo(obj)方法,给出了比较两个对象大小的方式

  2. 像String、包装类重写了compareTo(obj)方法以后,进行了从小到大的排列

  3. 重写CompareTo(obj)的规则

    如果当前对象this大于形参obj,则返回正整数,

    如果当前对象this小于形参obj,则返回负整数,

    如果当前对象this等于形参obj,则返回零,

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

public class Goods implements Comparable{

   private String name;
   private double price;

   public Goods() {
  }

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

   public String getName() {
       return name;
  }

   public double getPrice() {
       return price;
  }

   public void setName(String name) {
       this.name = name;
  }

   public void setPrice(double prive) {
       this.price = prive;
  }

   @Override
   public String toString() {
       return "Goods{" +
               "name='" + name + '\'' +
               ", prive=" + price +
               '}';
  }

   //指明商品比较大小的方式,按照价格从低到高,再按照商品名称从低到高排序
   @Override
   public int compareTo(Object o) {
       if(o instanceof Goods){
           Goods goods = (Goods)o;
           if(this.price > goods.price){
               return 1;
          }else if(this.price < goods.price){
               return -1;
          }else{
               //return 0;
               //再按照商品名称从高到低排序
               //return -this.name.compareTo(goods.name);
               return this.name.compareTo(goods.name);
          }
      }
       throw new RuntimeException("传入的数据类型不一致");
  }
}

  @Test
   public void test1(){
       Goods[] arr = new Goods[5];
       arr[0] = new Goods("lianxiang",24);
       arr[1] = new Goods("dell",43);
       arr[2] = new Goods("mi",12);
       arr[3] = new Goods("oppo",65);
       arr[3] = new Goods("huawei",65);

       Arrays.sort(arr);

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

 

 

定制排序:java.util.Comparator

1.当元素类型没有实现java.lang.Comparable接口而又不方便修改代码或者实现了java.lang.Comparable接口的排序规则不适合当前操作可以考虑Comparator的对象来排序

            Comparator com = new Comparator() {
               @Override
               public int compare(Object o1, Object o2) {
                   return 0;
              }
          };

 

2.重写compare(Object o1,Object o2)方法比较o1和o2的大小,如果方法返回正整数,则表示o1大于o2,如果方法返回负整数,则表示o1小于o2,如果返回0,表示相等

@Test
   public void test2(){
   String[] arr = new String[]{"AA","ff","FD","DD","WW"};
       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[5];
       arr[0] = new Goods("lianxiang",24);
       arr[1] = new Goods("dell",43);
       arr[2] = new Goods("mi",12);
       arr[3] = new Goods("oppo",65);
       arr[3] = new Goods("huawei",65);

       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));

  }

 

区别

Comparable接口的方式一旦一定,保证Comparable接口实现类的对象再任何都可以比较大小,Comparator接口属于临时性的比较

posted @   flypiggg  阅读(407)  评论(0编辑  收藏  举报
编辑推荐:
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
点击右上角即可分享
微信分享提示