zoukankan      html  css  js  c++  java
  • compareTo,Comparator和equals

    compareTo和equal

    在Java中我们常使用Comparable接口来实现排序,其中compareTo是实现该接口方法。我们知道compareTo返回0表示两个对象相等,返回正数表示大于,返回负数表示小于。同时我们也知道equals也可以判断两个对象是否相等。

    public class Student implements Comparable<Student>{
        private String id;
        private String name;
        private int age;
        
        public Student(String id,String name,int age){
            this.id = id;
            this.name = name;
            this.age = age;
        }
    
        public boolean equals(Object obj){
            if(obj == null){
                return false;
            }
            
            if(this == obj){
                return true;
            }
            
            if(obj.getClass() != this.getClass()){
                return false;
            }
            
            Student student = (Student)obj;
            if(!student.getName().equals(getName())){
                return false;
            }
            
            return true;
        }
        
        public int compareTo(Student student) {
            return this.age - student.age;
        }
    
        /** 省略getter、setter方法 */
    }
    //Student类实现Comparable接口和实现equals方法,其中compareTo是根据age来比对的,equals是根据name来比对的。
    public static void main(String[] args){
            List<Student> list = new ArrayList<>();
            list.add(new Student("1", "chenssy1", 24));
            list.add(new Student("2", "chenssy1", 26));
            
            Collections.sort(list);   //排序
            
            Student student = new Student("2", "chenssy1", 26);
            
            //检索student在list中的位置
            int index1 = list.indexOf(student);
            int index2 = Collections.binarySearch(list, student);
            
            System.out.println("index1 = " + index1);
            System.out.println("index2 = " + index2);
        }

    按照常规思路来说应该两者index是一致的,因为他们检索的是同一个对象,但是非常遗憾,其运行结果:

    index1 = 0
    index2 = 1

    为什么会产生这样不同的结果呢?这是因为indexOf和binarySearch的实现机制不同,indexOf是基于equals来实现的只要equals返回TRUE就认为已经找到了相同的元素。而binarySearch是基于compareTo方法的,当compareTo返回0 时就认为已经找到了该元素。在我们实现的Student类中我们覆写了compareTo和equals方法,但是我们的compareTo、equals的比较依据不同,一个是基于age、一个是基于name。比较依据不同那么得到的结果很有可能会不同。所以知道了原因,我们就好修改了:将两者之间的比较依据保持一致即可。

    对于compareTo和equals两个方法我们可以总结为:compareTo的属性元素决定排序后该对象所在位置,equals的属性元素决定两个对象是否等同,所以我们非常有必要确保当排序位置相同时,其equals也应该相等避免使用混淆。

    Comparator的使用

    如果一个数组中的对象实现了 Compareable 接口,则对这个数组进行排序非常简单: Arrays.sort(); 如果 List 实现了该接口的话 , 我们就可以调用Collections.sort 或者 Arrays 方法给他们排序。实际上 Java 平台库中的所有值类 (value classes) 都实现了 Compareable 接口。

    Comparator 的作用有两个:

    1. 如果类的设计师没有考虑到 Compare 的问题而没有实现 Comparable 接口,可以通过  Comparator 来实现比较算法进行排序

    2. 为了使用不同的排序标准做准备,比如:升序、降序或其他什么序

    public class CategoryComparator implements Comparator<CategoryGroupDTO> {
    
        private boolean isAsc;
    
        public CategoryComparator(boolean isAsc) {
            this.isAsc = isAsc;
        }
      //根据categoryIndex排序
        @Override
        public int compare(CategoryGroupDTO arg0, CategoryGroupDTO arg1) {
            if (arg0.getCategoryIndex() == 0 && arg1.getCategoryIndex() == 0)
                return 0;
            else {
                if (isAsc)
                    return arg0.getCategoryIndex() - arg1.getCategoryIndex();
                else
                    return arg1.getCategoryIndex() - arg0.getCategoryIndex();
            }
        }
    
    }
            //使用
         List<CategoryGroupDTO> prodResult = null; prodResult = poProductService.getProductGroupByCategory(poId); Collections.sort(prodResult, new CategoryComparator(true));
  • 相关阅读:
    4、redis之使用commons-pool
    好用的eclipse properties插件
    1、redis之安装与配置
    谷歌浏览器禁止window.close的问题
    在浏览器中使用JS打开并展示PDF文件
    JAVA遍历Map的方法
    GEOS库学习之三:空间关系、DE-9IM和谓词
    GEOS库的学习之二:简单几何图形的创建
    GEOS库的学习之一:介绍和编译
    GEOS库在windows中的编译和测试(vs2012)
  • 原文地址:https://www.cnblogs.com/wade-luffy/p/5740999.html
Copyright © 2011-2022 走看看