对象比较器:Comparable和Comparator

在进行对象数组排序的过程中需要使用到比较器,比较器有两个:Comparable和Comparator

 

①、java.lang.Comparable:是在类定义是时候默认实现好的接口,里面提供有一个compareTo()方法用于大小比较

java规定:假如a和b是实现Comparable接口类创建的两个对象,

当a.compareTo(b)<0时,称a小于b;

a.compareTo(b)>0时,称a大于b;

a.compareTo(b)==0时,称a等于b。

 

②、java.util.Comparator:需要单独定义一个排序的比较规则类,里面有两个方法compare(),equals()

当对象刚开始时没有进行排序,但因后续要求需要进行排序时,为了不影响其他程序,可以使用此接口,新建一个专门用来对这个对象排序的类,这样对其他程序影响不大

优先使用Comparable

 

package com.wzy.main;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.TreeSet;

import org.omg.PortableInterceptor.Interceptor;
//方式1. 在此类上直接实现
Comparable接口
class People implements Comparable{
    People(String name,int age){
        this.name = name;
        this.age = age;
    }
    private String name;
    private int age;
    public int getAge() {
        return age;
    }
    public String getName() {
        return name;
    }
    @Override
    public String toString() {
        return "name="+name+", age="+age;
    }
    @Override
    public int compareTo(Object o) {
        People p = (People)o;
        return p.age-this.age;
    }
}

//方式2. 使用Comparator比较器
class PersonComparator implements Comparator {
    @Override
    public int compare(Object one, Object another) {
         return ((People)one).getAge()-((People)another).getAge();
    }
    
}


public class Test01 {
public static void main(String[] args) {

List<People> list = new ArrayList<People>();
list.add(new People("aaa", 15));
list.add(new People("bbb", 10));
list.add(new People("ccc", 16));
list.add(new People("ddd", 13));
list.add(new People("eee", 19));


/*1 、使用Comparable,按照age来排*/
// Collections.sort(list);//1.1 传统实现方式,list的状态已经被改变为排序完的状态了
list.stream().sorted().forEach(System.out::println);//1.2 使用lambda表达式实现,没有改变list的状态

List l = Arrays.asList(list.stream().sorted().toArray());//直接把排序好的对象取出来

/*2 、使用Comparator比较器,按照age进行排序*/
// Collections.sort(list, new PersonComparator());//2.1 传统实现
// list.stream().sorted((one,another)->((People)one).getAge()-((People)another).getAge())
// .forEach(System.out::println); 2.2 lambda表达式实现

/**
* 建议使用lambda表达式,这样不会改变对象的状态
*
* */
Iterator<People> interceptor = list.iterator();
while(interceptor.hasNext()){
System.out.println(interceptor.next());
}

}
}

 

posted on 2016-05-29 14:08  wzyy  阅读(1140)  评论(0编辑  收藏  举报