1. 程式人生 > >TreeSet集合排序兩種實現方式Comparable和Comparator比較

TreeSet集合排序兩種實現方式Comparable和Comparator比較

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

/**
 * TreeSet集合排序有兩種方式,Comparable和Comparator區別:
 * 1:讓元素自身具備比較性,需要元素物件實現Comparable介面,覆蓋compareTo方法。
 * 2:讓集合自身具備比較性,需要定義一個實現了Comparator介面的比較器,並覆蓋compare方法,
 *   並將該類物件作為實際引數傳遞給TreeSet集合的建構函式。 第二種方式較為靈活。
 */
public class TreeSetDemo3 {
	public static void main(String[] args) {
		
		Teacher t1 = new Teacher(111L);
		Teacher t2 = new Teacher(222L);
		
		TreeSet<Teacher> teachers = new TreeSet<Teacher>();
		teachers.add(t1);
		teachers.add(t2);
		
		for (Iterator<Teacher> iter = teachers.iterator(); iter.hasNext();) {
			Teacher t =  iter.next();
			System.out.println(t.getId());
		}
		
		System.out.println("------------------------");
		
		Student s1 = new Student(123L);
		Student s2 = new Student(456L);					//讓集合自身具備比較性,這種方式較靈活	
		TreeSet<Student> students = new TreeSet<Student>(new StudentComparator());	

		students.add(s1);
		students.add(s2);

		for (Iterator<Student> iter = students.iterator(); iter.hasNext();) {
			Student s = iter.next();
			System.out.println(s.getId());
		}
		
	}
}

/**
 * 採用實現Comparable介面重寫compareTo方法的方式,讓元素自身具備比較性
 * @author Administrator
 *
 */
class Teacher implements Comparable<Teacher>{
	private Long id;
	
	public Teacher() {
	}
	public Teacher(Long id) {
		this.id = id;
	}

	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	
	@Override
	public int compareTo(Teacher o) {
		return (int) (this.id - o.getId());
	}
}

//學生類
class Student {

	private Long id;

	public Student() {
	}
	public Student(Long id) {
		this.id = id;
	}

	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
}

/**
 * 自定義定義一個實現了Comparator介面的比較器,並覆蓋compare方法
 */
class StudentComparator implements Comparator<Student> {
	@Override
	public int compare(Student o1, Student o2) {
		return (int) (o1.getId() - o2.getId()); // 根據升序排序
	}
}