J2SE学习笔记:J2SE重点难点,TreeSet比较器

package cn.temp;

import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

/**
 * 求解接口Comparator和Comparable的区别(请详细些)?
 * @author Cuilitang
 *
 */

public class Temp {
	public static void main(String[] args) {
		Set<Student> treeset = new TreeSet<Student>();
		treeset.add(new Student(1,"张三"));
		treeset.add(new Student(2,"李四"));
		treeset.add(new Student(3,"王五"));
		
		Iterator<Student> it = treeset.iterator();
		while(it.hasNext()){
			System.out.println(it.next());
		}
	}

}
/*
 * 此程序中Student 对象被存储进treeset集合中,但是treeset集合自身并没有比较对象先后顺序的比较器这样就需要调用对象自身的比较器来进行比较。
 * Person是自定义对象,为了能有比较性必须的继承使对象有比较性特性的接口:Comparable,这种情况很常见,比如要想让对象能够序列化就需要实现Serializable。
 * TreeSet集合是有序的所以迭代出来的元素就是按照Student对象自身的比较器比较的结果.
 * 若想测试,可以修改一下Student类中的compareTo()试一试。
 */
class Student implements Comparable<Student>{
	int id;
	String name;
	Student(int id, String name){
		this.id = id;
		this.name = name;
	}
	
	@Override
	public int compareTo(Student s1) {           //Student类的自然排序
		// TODO Auto-generated method stub
		int x = s1.id - this.id;   //比较年龄
		int y = s1.name.compareTo(this.name);//比较年龄,String实现了Comparable接口,并重写了conpareTo方法
		return x == 0 ? y:x;
	}
	
	@Override
	public String toString(){
		return id + "+" + name +"\t";
		
	}
	
}
package cn.temp;

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

/**
 * 求解接口Comparator和Comparable的区别(请详细些)?
 * @author Cuilitang
 *
 */

public class CopyOfTemp {
	public static void main(String[] args) {
		Set<Teacher> treeset = new TreeSet<Teacher>(new MyComparetor());
		treeset.add(new Teacher(1,"张三"));
		treeset.add(new Teacher(2,"李四"));
		treeset.add(new Teacher(3,"王五"));
		
		Iterator<Teacher> it = treeset.iterator();
		while(it.hasNext()){
			System.out.println(it.next());
		}
	}

}
	class MyComparetor implements Comparator<Teacher>{       //集合的比较器

		@Override
		public int compare(Teacher t1, Teacher t2) {
			// TODO Auto-generated method stub
			int x = t1.id - t2.id;
			int y = t1.name.compareTo(t2.name);
			return x == 0 ? y:x;
		}
}
/*
 * 此程序中Teacher 对象被存储进treeset集合中.跟上个程序不同,treeset集合自身具有比较器(在new对象时候传入了MyComparetor对象)。
 * 这样就不再要求传入的对象必须自身具备比较性。
 * TreeSet集合迭代出来的元素就是按照MyComparetor比较器比较的结果.
 * 若想测试,可以修改一下MyComparetor类中的compare()试一试。
 */
class Teacher{
	int id;
	String name;
	Teacher(int id, String name){
		this.id = id;
		this.name = name;
	}
	
	@Override
	public String toString(){
		return id + "+" + name +"\t";
		
	}
	
}

/**
 *综上所述,Compareable接口和Comparetor接口实现的都是比较功能,两者都可以通过重写方法来对对象的顺序进行比较。
 *但是它们的调用者不同,具体的比较的方法中接受的参数也不同。
 *Compareable是被一个对象调用去与通过参数传进来的另一个对象比较;Comparetor的应用场景到目前为止我所知道的就是在TreeSet集合中,对集合元素进行排序。
 *最后很重要的一点:在Treeset集合中,若是两个比较器同时出现Comparetor优先级高于Compareable。
 */


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值