Java中比较对象大小的两种实现方式

引入原因:

Java中的对象,正常情况下,只能进行比较:== 或!= ,不能使用 < 或 > ,但是在开发时需要用到比较对象的大小

1.Comparable接口的使用(自然排序)

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

2.像String 、包装类等重写了compareTo()方法后,默认执行了从小到大的排序

3.重写compareTo()的规则:

如果当前对象this大于形参对象obj,则返回正整数,如果当前对象this小于形参对象obj,则返回负整数。如果当前对象this等于形参对象obj,则返回零。

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

String类的自然排序实现举例:

 @Test
    public void test1(){
        String[] arr=new String[] {"GG","MM","AA","CC","DD","KK"};
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));  //[AA, CC, DD, GG, KK, MM]
    }

自定义类的自然排序举例: 

 @Test
    public void test2(){
        Goods[] arr=new Goods[4];
        arr[0] = new Goods("lenovoMouse",34);
        arr[1] = new Goods("dellMouse",66);
        arr[2] = new Goods("xiaomiMouse",50);
        arr[3] = new Goods("hahaMouse",66);

        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
        /*
        运行结果:
         [Goods{name=‘lenovoMouse‘, price=34.0}, Goods{name=‘xiaomiMouse‘, price=50.0},
          Goods{name=‘dellMouse‘, price=66.0}, Goods{name=‘hahaMouse‘, price=66.0}]
         */
    }

Goods商品类的实现代码:

public class Goods implements Comparable {
    private String name;
    private double price;

    public Goods() {

    }

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

    public String getName() {
        return name;
    }

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

    public double getPrice() {
        return price;
    }

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

    @Override
    public String toString() {
        return "Goods{" +
                "name=‘" + name + ‘\‘‘ +
                ", price=" + 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);
        }
       throw new RuntimeException("传入的数据类型不一致");
    }
}

2.Comparator接口的使用 (定制排序)

2.1引入原因:当元素的类型没有实现java.lang.Comparable借口而又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不适合当前的操作可以考虑使用Comparator的对象来实现排序。

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

举例一:

  @Test
    public void test1(){
        String[] arr=new String[] {"GG","MM","AA","CC","DD","KK"};
        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));  //[MM, KK, GG, DD, CC, AA]
    }

举例二:

 @Test
    public void test2(){
        Goods[] arr=new Goods[5];
        arr[0] = new Goods("lenovoMouse",34);
        arr[1] = new Goods("dellMouse",66);
        arr[2] = new Goods("xiaomiMouse",50);
        arr[3] = new Goods("hahaMouse",66);
        arr[4] = new Goods("hahaMouse",166);

        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));
        /*
        运行结果:
        [Goods{name=‘dellMouse‘, price=66.0}, Goods{name=‘hahaMouse‘, price=166.0},
         Goods{name=‘hahaMouse‘, price=66.0}, Goods{name=‘lenovoMouse‘, price=34.0},
         Goods{name=‘xiaomiMouse‘, price=50.0}]
         */
    }

2.3Comparable接口与Comparator接口的使用的对比:

Comparable接口的方式一旦指定,保证Comparable接口实现类的对象在任何位置都可以比较大小。

Comparator接口属于临时性的比较。

原文地址:https://www.cnblogs.com/gujun1998/p/11212401.html

时间: 2024-10-05 15:44:11

Java中比较对象大小的两种实现方式的相关文章

Ajax中的get和post两种请求方式的异同

Ajax中我们经常用到get和post请求.那么什么时候用get请求,什么时候用post方式请求呢? 在做回答前我们首先要了解get和post的区别.   1. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到.post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址.用户看不到这个过程.   2. 对于get方式,服务器端用Request.QueryS

我爱Java系列之---【SpringBoot中常用的注解和两种注入方式】

@EnableConfigurationProperties(DataSourceProperties.class) 来声明要使用DataSourceProperties 这个类并初始化该类对象,该类不用放在IOC容器中,可以通过该注解直接使用. [email protected]:一般写在类上边,通过该注解将当前类初始化到Spring的IOC容器中,其他类若想调用,直接用@Autowired去容器中拿. [email protected]: 一般写在类上边,标明该类是一个配置类,被注解的类内部

MyBatis中主键回填的两种实现方式

主键回填其实是一个非常常见的需求,特别是在数据添加的过程中,我们经常需要添加完数据之后,需要获取刚刚添加的数据 id,无论是 Jdbc 还是各种各样的数据库框架都对此提供了相关的支持,本文我就来和和大家分享下数据库主键回填在 MyBatis 中的两种实现思路. 原生写法 框架来源于我们学过的基础知识,主键回填实际上是一个在 JDBC 中就被支持的写法,有的小伙伴可能不知道这一点,因此这里我先来说说在 JDBC 中如何实现主键回填. JDBC 中实现主键回填其实非常容易,主要是在构造 Prepar

java中调用dll文件的两种方法

一中是用JNA方法,另外是用JNative方法,两种都是转载来的, JNA地址:http://blog.csdn.net/shendl/article/details/3589676   JNative地址:http://www.jb51.net/article/35232.htm JNA方法: 介绍 给大家介绍一个最新的访问本机代码的Java框架—JNA. JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架

Java中serialVersionUID的解释及两种生成方式的区别(转载)

转载自:http://blog.csdn.net/xuanxiaochuan/article/details/25052057 serialVersionUID作用:        序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性.有两种生成方式:       一个是默认的1L,比如:private static final long serialVersionUID = 1L;       一个是根据类名.接口名.成员方法及属性等来生成一个64位的哈希字段,比如:    

从Java源码看String的两种比较方式

String的两种字符串比较方式 == 和 equals方法 ==: ==比较的是字符串在内存中的地址 代码示例: 1 public class EqualsDemo { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 String s1 = "String"; 8 String s2 = "String"; 9 String s3 = new String(&quo

转:Ajax中的get和post两种请求方式的异同

1. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到.post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址.用户看不到这个过程. 2. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据.两种方式的参数都可以用Request来获得. 3.get传送的数据量

java 序列化 serialVersionUID 的作用 和 两种添加方式

serialVersionUID适用于Java的序列化机制.简单来说,Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常,即是InvalidCastException. serialVersionUID有两种显示的生成方式:        一是默认的1

IOC容器在web容器中初始化——(一)两种配置方式

参考文章http://blog.csdn.net/liuganggao/article/details/44083817,http://blog.csdn.net/u013185616/article/details/52186184. 最近在研究IOC容器在web容器中初始化的过程.阅读了源码,参照了很多文章,在这里记录一下. 使用的web容器为tomcat7.spring的jar包为4.3.7.RELEASE版本. 我们可以通过web.xml配置文件web容器中声明spring容器.有以下两