自然排序和自定义排序演示

本例演示了在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]

你可能感兴趣的:(JavaSE)