在进行对象数组排序的过程中需要使用到比较器,比较器有两个: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());
}
}
}