zoukankan      html  css  js  c++  java
  • Java Comparable和Comparator

    Java中在进行数据排序时,Comparable和Comparator不可缺少会遇得到。普通的String、Integer等类型,已经实现了Comparable接口,而有些时候,我们须要对一些其它不存在内在排序关系的类进行排序,那么就须要实现以上两个接口,可是会有所不同。

    之前搜索两者的关系。看到这样一篇文章。Comparable与Comparator的差别,里面有些说法有点太深奥,只是我来总结的话。两者最大的差别就在于假设实现Comparable,就意味着类的排序规则固定了,而假设实现Comparator,类本身是没有排序规则的,仅仅是通过制定外部规则使其进行排序,排序规则你能够指定非常多类型

    那么就且来看看我做的一个样例,我们新建一个美女类(BeautyGirl)。使其具有年龄(age)、身高(height)属性,姑且依照年龄优先于身高的原则来进行排序,那么实现方式就有以下的方式。

    Comparable

    package com.mwq.comparable;
    
    public class BeautyGirl implements Comparable<BeautyGirl> {
        private int age;
        private Double height;
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public Double getHeight() {
            return height;
        }
    
        public void setHeight(Double height) {
            this.height = height;
        }
    
        @Override
        public int compareTo(BeautyGirl girl) {
            if (this.getAge() == girl.getAge()) {
                return compareHeight(girl);
            } else {
                return this.getAge() - girl.getAge();
            }
        }
    
        private int compareHeight(BeautyGirl girl) {
            return girl.getHeight().compareTo(this.getHeight());
        }
    
        @Override
        public String toString() {
            return "美女{年龄:" + this.getAge() + "身高:" + this.getHeight() + "}";
        }
    
    }
    

    实现comparable接口,就意味着须要在美女类中实现compareTo方法,也就是说,该类在排序的时候必须是年龄优先于身高。

    来看看測试类

    package com.mwq.comparable;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    public class Test {
    
        public static void main(String[] args) {
            List<BeautyGirl> girls = new ArrayList<BeautyGirl>();
    
            BeautyGirl girl = new BeautyGirl();
            girl.setAge(28);
            girl.setHeight(170.00);
            girls.add(girl);
    
            girl = new BeautyGirl();
            girl.setAge(25);
            girl.setHeight(183.00);
            girls.add(girl);
    
            girl = new BeautyGirl();
            girl.setAge(28);
            girl.setHeight(180.30);
            girls.add(girl);
    
            girl = new BeautyGirl();
            girl.setAge(32);
            girl.setHeight(170.00);
            girls.add(girl);
    
            girl = new BeautyGirl();
            girl.setAge(21);
            girl.setHeight(170.00);
            girls.add(girl);
    
            for (BeautyGirl beautyGirl : girls) {
                System.out.println(beautyGirl);
            }
    
            Collections.sort(girls);
            System.out.println("排序一下---------------------------------------------");
    
            for (BeautyGirl beautyGirl : girls) {
                System.out.println(beautyGirl);
            }
        }
    
    }
    

    输出结果例如以下

    美女{年龄:28身高:170.0}
    美女{年龄:25身高:183.0}
    美女{年龄:28身高:180.3}
    美女{年龄:32身高:170.0}
    美女{年龄:21身高:170.0}
    排序一下---------------------------------------------
    美女{年龄:21身高:170.0}
    美女{年龄:25身高:183.0}
    美女{年龄:28身高:170.0}
    美女{年龄:28身高:180.3}
    美女{年龄:32身高:170.0}

    Comparator

    package com.mwq.comparator;
    
    public class BeautyGirl {
        private int age;
        private Double height;
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public Double getHeight() {
            return height;
        }
    
        public void setHeight(Double height) {
            this.height = height;
        }
    
        @Override
        public String toString() {
            return "美女{年龄:" + this.getAge() + "身高:" + this.getHeight() + "}";
        }
    
    }
    
    package com.mwq.comparator;
    
    import java.util.Comparator;
    
    /**
     * 实现美女的排序
     */
    public class BeautyGirlComparator implements Comparator<BeautyGirl> {
    
        @Override
        public int compare(BeautyGirl girl1, BeautyGirl girl2) {
            // 姑且把年龄放在第一位
            if (girl1.getAge() == girl2.getAge()) {
                return compareHeight(girl1, girl2);
            } else {
                return girl1.getAge() - girl2.getAge();
            }
        }
    
        private int compareHeight(BeautyGirl girl1, BeautyGirl girl2) {
            // 把身高放在第二位
            return girl1.getHeight().compareTo(girl2.getHeight());
        }
    
    }
    
    Collections.sort(girls, new BeautyGirlComparator());

    这样是使用排序的时候,仅仅要你指定一个新的规则,就会依照新的规则来排序,而不须要再变更BeautyGirl类。

    比如。你能够依照身高优先、年龄次之的排序。

    总结两者的差别就在于排序规则的制定。假设排序规则善变。那么使用comparator是个好办法,假设规则固定,实现comparable更好,至少少写一个类。

  • 相关阅读:
    老王python博客
    python中文分词
    python 字典(dict)get方法应用
    python yield和generators(生成器)
    python ASCII返回对应的值(chr)
    python 字符串特点
    python 包的定义,结构,导入过程
    fabric的安装和配置
    python 正则表达式re findall
    python unittest单元测试方法和用例
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/7379669.html
Copyright © 2011-2022 走看看