关于Comparable与Comparator

  首先说明一下这两个都是用来排序的, 只是应用起来有点差别而已.

有以下情景:

  对于 List<String> list = new ArrayList<String>(); 我们可以直接用 Collections.sort(list); 排序. 那么我们如果有自己一个类比如: Person类, 要想在List中排序的话, 怎么做?

1. 使用 Comparable 接口在 Person 类内部实现排序

2. 使用 Comparator 接口自定义一个排序类, 在使用 Collections.sort() 方法的时候传进去, 实现排序.

首先来说第一种方法:

  定义一个Person 类, 实现 Comparable 接口, 并实现其 compareTo(T o) 方法

public class Person implements Comparable<Person> {

    private String name;
    private Integer age;

    public Person() {
        super();
    }

    public Person(String name, Integer age) {
        super();
        this.name = name;
        this.age = age;
    }

    @Override
    public int compareTo(Person o) {
        if (this.age > o.age) {
            return 1;
        } else if (this.age < o.age) {
            return -1;
        }
        return 0;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }

}

  关于返回值需要知道:

  a). 返回 正数 表示当前对象比传入的对象大.

  b). 返回 负数 表示当前对象比传入的对象小.

  c). 返回   0   表示等值.

  测试类:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.junit.Test;

public class TestComparable {

    @Test
    public void test() {
        List<Person> list = new ArrayList<>();
        Person p1 = new Person("Tom", 12);
        Person p2 = new Person("Mike", 14);
        Person p3 = new Person("Jerry", 6);
        list.add(p1);
        list.add(p2);
        list.add(p3);
        // 对 list 集合进行排序, 这时Person类中的 compareTo起排序作用.
        Collections.sort(list);
        System.out.println(list);
    }

}

这种方法灵活度差,  只适用于当前类, 通用性差, 但是简单, 只要实现这个接口, 定义了比较的规则,  直接调用 Collections.sort(list); 就可以了.

接下来说第二种方法:

  首先要自己写一个排序类, 并实现 Comparator 接口.

import java.util.Comparator;

public class MyComparator implements Comparator<String> {
    @Override
    public int compare(String o1, String o2) {
        if( o1.charAt(1) > o2.charAt(1) ){
            return 1;
        } else if(o1.charAt(1) < o2.charAt(1)){
            return -1;
        }
        return 0;
    }
}

  当然我这里是给 String 类排序, 只是例子, 因为String 类已经内部利用第一种方法实现了排序, 可以查看 String 的源代码.

  返回值的规则与第一种方法是一样的.

  测试类:

import java.util.Arrays;
import java.util.List;

import org.junit.Test;

public class TestComparator {

    @Test
    public void test(){
        List<String> list = Arrays.asList("Tom","Mike","Jerry","Kim");
        list.sort(new MyComparator());
        System.out.println(list);
    }

}

  用这个方法的好处是, 不需要修改源代码, 只需要定义比较器就可以了, 然后在排序的时候把比较器传进去就 OK 了.

  也可以写一些通用的比较方法在里面, 提高通用性.

各有好处, 灵活使用就好了.

时间: 2024-10-18 01:14:20

关于Comparable与Comparator的相关文章

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; /** * 程序设计的基本目标是"将保持不变的事物与会发生改变的事物相分离" * 而这是,不变的是通用的排序算法,变化的是各种对象相互比较的方式, * 因此,

对象大小对比之Comparable与Comparator

一 概述 1.Comparable与Comparator使用背景 数值型数据(byte int short long float double)天生可对比大小,可排序,String实现了Comparable接口也可以对比大小与排序,而自定义类多种多样,没有一个共有的可以用作排序的指标,因此需要在自定义类中手动建立对比的方法,出于这个目的,java提供了两个接口Comparable与Comparator. 2.集合排序 Collections.sort()底层排序依靠的是Arrays.sort()

comparable 与 comparator

工作时间久了,偶尔会迷糊..... comparable 与 comparator 区别:(策略模式) 一般需要比较或者排序的类,都需要实现 comparable ,实现comparable就需要去重写 compareto方法,一般需要在这个方法里写明具体需要怎么比较,那么问题来了,如果以后类的比较方式变了的话,这个compareto方法就需要修改: 故根据策略模式,将需要比较的具体实现交给comparator接口,需要具体比较的话就实现comparator接口重写compare方法,返回int

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,

比较器(Comparable、Comparator)类及 二叉树的排序算法

之前Arrays 类中存在sort() 方法, 此方法可以直接对 对象数组进行排序. 1.Comparable接口 可以直接使用java.util.Arrays 类进行数组的排序操作,但对象所在的类必须实现Comparable 接口,用于指定排序接口. Comparable 接口定义如下: public interface Comparable<T>{ public int compareTo(T o); } 此方法返回一个int 类型的数据,但是此int 的值只能是以下三种: 1:表示大于

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