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更好,至少少写一个类。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-02 20:13:34

java:Comparable和Comparator的相关文章

java Comparable和Comparator

在java数组.Collection和Map的排序中,经常会用到Comparable和Comparator这两个接口. 1.Comparable 我们可以通过Arrays.sort()方法给数组排序: public static void main(String[] args) { int[] intArr={1,5,7,6,3,4}; Arrays.sort(intArr); System.out.println(Arrays.toString(intArr)); /* output: [1,

java Comparable 和 Comparator接口区别

Comparable 简介 Comparable 是排序接口. 若一个类实现了Comparable接口,就意味着"该类支持排序".  即然实现Comparable接口的类支持排序,假设现在存在"实现Comparable接口的类的对象的List列表(或数组)",则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序. 此外,"实现Comparable接口的类的对象"可以用作"有序映射(如

java Comparable与Comparator接口辨析

当可以接触到类的源码时,实现Comparable接口,重写public int compareTo(T o)函数. 这可以使类本身变得可比较(comparable), 可以用Collections.sort()排序,可以当map的key. 当不可接触到类的源码时,又想对类进行排序,可以实现Comparator接口.它是一个比较器,指导Collections.sort()等方法对对象排序. 这时需要实现 int compare (T o1, T o2).实现后我们可以将Comparator传递给C

Java comparable 和 comparator

一.comparator 接口继承 public class ComparatorTest { /** * @param args */ public static void main(String[] args) { // ----写程序 List<Step> list=new ArrayList<Step>(); for (int i = 10; i < 12; i++) { list.add(new Step(i)); } for (int i = 5; i <

Java核心API -- 7(Iterator迭代器、Comparable、Comparator比较器)

1. Iterator迭代器 所有Collection的实现类都实现了iterator方法,该方法返回一个Iterator接口类型的对象,用于实现对集合元素迭代的便利.在java.util包下. 1)Iterator定义有三个方法: ①boolean hasNext()方法:判断指针后面是否有元素. ②E next()方法:指针后移,并返回当前元素.E代表泛型,默认为Object类型. ③void remove()方法:在原集合中删除刚刚返回的元素. 2)对于List集合而言,可以通过基于下标的

Java中Comparable和Comparator实现对象比较

1.通过Comparable实现排序 package Comparable; import java.util.Arrays; public class ComparableUser implements Comparable<ComparableUser> { private String id; private int age; public ComparableUser(String id, int age) { this.id = id; this.age = age; } publi

java 数组比较,元素的比较,Comparable,Comparator比较的应用实现,排序,查找示例

java 数组比较,元素的比较,自定义Comparator的实现,排序,查找示例 package org.rui.array.compar; import java.util.Arrays; import java.util.Random; import org.rui.generics.anonymity.Generator; /** * 程序设计的基本目标是"将保持不变的事物与会发生改变的事物相分离" * 而这是,不变的是通用的排序算法,变化的是各种对象相互比较的方式, * 因此,

Java中Comparable和Comparator区别小结

一.Comparable简介 Comparable是排序接口.若一个类实现了Comparable接口,就意味着该类支持排序.实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序. 此外,实现此接口的对象可以用作有序映射中的键或有序集合中的集合,无需指定比较器.该接口定义如下: package java.lang; import java.util.*; public interface Comparable<T> {

Java 集合类(1)--Comparable 和 Comparator的比较

Comparable 是在集合内部定义的方法实现的排序: Comparator 是在集合外部实现的排序 Comparator位于包java.util下,而Comparable位于包java.lang下 Comparable 是一个对象本身就已经支持自比较所需要实现的接口,如 String.Integer 自己就可以完成比较大小操作,已经实现了Comparable接口 Comparator 是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象

java中Comparable 和Comparator

java中Comparable 和Comparator -Comparable接口 接口定义 public interface Comparable<T> { public int compareTo(T o); } 该接口中仅仅包含了一个compareTO()函数, int compareTo(Object o): 比较当前实例对象与对象o,如果位于对象o之前,返回负值,如果两个对象在排序中位置相同,则返回0,如果位于对象o后面,则返回正值. 实例: x.compareTo(y) 来&quo