本例演示了在TreeSet中添加对象时候可以自动排序的功能:


总结:想要使用jdk自带的排序功能,被排序对象必须实现Comparator(自然排序)或Comparable(自定义排序,需要自定义一个比较器)接口


1、要使用  TreeSet 或者 Collections.sort(), 插入的对象必须排序的功能(相互之间可以比较大小)。


2、compareTo 这个方法会被 TreeSet 自动回调。

4、代码如下:


package com.tiger.comparator;

/**
* Cat类,目的使Cat加到TreeSet中后,会根据猫的年龄进行排序。
* @author tiger
*/
class Cat {
int age;
String name;
public Cat(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "(age=" + age + ", name=" + name + ")";
}
}
package com.tiger.comparator;

import java.util.Comparator;
/**
* 自定义比较器,传入Cat,专门对猫,根据猫的年龄进行排序
* @author tiger
* @date 2017年11月4日
*/
class CatComparator implements Comparator

{
//自动回调
@Override
public int compare(Cat cat1, Cat cat2) {
int ret = cat1.age - cat2.age;
return ret;
}
}
package com.tiger.comparator;

/**
* Person1类, 实现 Comparable,按照年龄自然排序。
* @author tiger
*/
public class Person implements Comparable

{

int age;
String name;

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

/*
* 定义排序规则,TreeSet会自动回调这个方法
*/
@Override
public int compareTo(Person p) {
int ret = this.age - p.age;
return -ret;
}

@Override
public String toString() {
return "(age = " + age + ", name = " + name + ")";
}
}package com.tiger.comparator;

import java.text.*;
import java.util.*;
/**
* 测试类
* @author tiger
*/
@SuppressWarnings("all")
public class CompaTest {
public static void main(String[] args) {
comparable();
comparator();
dateComparable();
}
/*
* 自然排序
*/
public static void comparable(){
System.out.println("--------自然排序---------");

Person p = new Person(1,"李明");
Person p1 = new Person(21,"佳佳");
Person p2 = new Person(10,"金晶");
Person p3 = new Person(9,"濑户");

Set

set = new TreeSet

();

set.add(p);
set.add(p1);
set.add(p2);
set.add(p3);

System.out.println(set);
}
/*
* 自定义排序
*/
public static void comparator(){
System.out.println("--------自定义排序---------");

Cat[] cats = {new Cat(23, "龙猫"),new Cat(12, "红猫"),new Cat(45, "黑猫"),new Cat(3, "白猫")};

Comparator catCompara = new CatComparator();
//创建TreeSet对象时,将比较器传入。
Set set = new TreeSet(catCompara);

Collections.addAll(set, cats);

System.out.println(set);
}
/*
* 内之类,已经实现了比较接口,不需要自己去写。
*/
public static void dateComparable(){
System.out.println("--------内置类已经实现了Comparable接口---------");
Set set = new TreeSet();
SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd HH:ss:mm");
//获取当前时间
Date date1 = new Date();
try {
Date date2 = sdf.parse("2016-02-12 12:23:12");
Date date3 = sdf.parse("2012-01-10 15:15:18");
Date date4 = sdf.parse("2015-09-05 21:23:19");
set.add(date1);
set.add(date2);
set.add(date3);
set.add(date4);
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println(set);
}
}




5、运行结果如下:


--------自然排序---------
[(age = 1, name = 李明), (age = 9, name = 濑户), (age = 10, name = 金晶), (age = 21, name = 佳佳)]
--------自定义排序---------
[(age=3, name=白猫), (age=12, name=红猫), (age=23, name=龙猫), (age=45, name=黑猫)]
--------内置类已经实现了Comparable接口---------
[Tue Jan 10 15:18:15 CST 2012, Sat Sep 05 21:19:23 CST 2015, Fri Feb 12 12:12:23 CST 2016, Sat Jul 15 13:13:09 CST 2017]