【TreeSet】自然排序与比较器排序

1.自然排序


对象类:
public class Examinee implements Comparable
   
   
    
    {//实现接口
	private int scorce;

	//构造方法与get、set方法略

	@Override
	public String toString() {
		return this.getScorce()+"";
	}
	/**
	 * 重写的compareTo方法
	 */
	@Override
	public int compareTo(Examinee o) {
		return o.getScorce() - this.getScorce();
	}
}

   
   

测试类:

import java.util.TreeSet;

public class TreeSetTest {

	public static void main(String[] args) {
		//TreeSet自然排序
		TreeSet
   
   
    
     ts = new TreeSet
    
    
     
     ();
		
		ts.add(new Examinee(66));
		ts.add(new Examinee(93));
		ts.add(new Examinee(52));
		ts.add(new Examinee(75));
		ts.add(new Examinee(83));
		
		System.out.println(ts);//[93, 83, 75, 66, 52]
	}

}
    
    
   
   

要点:使用TreeSet自然排序法时需要实现Comparable接口,并将泛型注为当前对象类,然后重写compareTo();方法。

关于compareTo方法的使用方法:

@override

public int compareTo(类名 形参){

return 形参.返回int类型的方法 - this.与前面相同的方法;

//从大到小排序。若从小到大只需交换减数与被减数

}

2.比较器排序

对象类:

public class Examinee{//不实现接口
	private int scorce;

    //构造方法与get、set方法略
	
	@Override
	public String toString() {
		return this.getScorce()+"";
	}
	/**
	 * 不在此重写compareTo方法。适用于不允许修改,无法实现Comparable接口的类
	 */
}
测试类:

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

public class TreeSetTest {

	public static void main(String[] args) {
		//TreeSet比较器排序
		TreeSet
   
   
    
     ts = new TreeSet
    
    
     
     (new Comparator
     
     
      
      () {
			//使用匿名内部类
			@Override
			public int compare(Examinee o1, Examinee o2) {
				return o1.getScorce() - o2.getScorce();
			}
		});
		
		ts.add(new Examinee(66));
		ts.add(new Examinee(93));
		ts.add(new Examinee(52));
		ts.add(new Examinee(75));
		ts.add(new Examinee(83));
		
		System.out.println(ts);//[52, 66, 75, 83, 93]
	}
}

     
     
    
    
   
   

要点:使用TreeSet比较器排序法时不需要实现Comparable接口,只在新建TreeSet时使用匿名内部类重写compareTo方法即可。当对象类为Java内部类或其他没有修改权限的类时可以使用此方法。效果与自然排序相同。在重写compareTo方法时要注意两个形参属性相减的顺序。

TreeMap的key排序操作同理。

关于匿名内部类可以参考http://blog.csdn.net/spixii/article/details/52336883

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值