TreeSet类 Comparator与Comparable

1、TreeSet类
是SortedSet接口的实现类。可以确保集合中的元素保持有序状态。根据红黑树的存储方式来存储集合元素,中间用到的比较可以通过两种方式实现:
 待存入集合的对象元素继承重写Comparable接口中的comparator()方法完成,
 继承重写Comparator接口中的compare()方法,然后将Comparator接口实现类的对象传给TreeSet的构造函数,建立TreeSet集合。
这里的比较不是通过equals方法。我们比较对象时一般使用equals方法,因此应该另equals方法的结果和TreeSet使用的比较方法的结果一致,避免存入相同的元素或不同的元素(equals方法)无法存入(treeSet使用的比较方法)。

由于元素有序,TreeSet中有如下特有方法:
访问第一个,最后一个  Object first()   object last()
访问前一个,后一个  object lower(Object o)  object higher(Object o)
截取自Treeset(3种)  SortedSet subSet(fromElem, toElem) 包含头,不包含尾
                                           SortedSet subSet(toElem)  从TreeSet头到toElem(不包含尾)
                                           SortedSet subSet(fromElem)  从fromElem(包含)到TreeSet尾
定义排序使用的比较器  Comparator comparator();该方法返回定制排序所使用的对象的Comparator。如果使用的是自然排序,返回null


与HashSet采用hash算法hashcode决定元素的存储位置不同,TreeSet采用红黑树的数据结构来存储集合元(是否存储,存储位置等)。

2、TreeSet类自然排序
 TreeSet不是根据插入的先后顺序进行排序的,而是根据元素的大小进行排序的。TreeSet支持两种方式的排序:自然排序和定制排序。
 自然排序:调用集合元素的CompareTo(Object obj)方法比较元素大小,然后将元素按照升序排序。Java中提供了一个Comparable接口,其中定义了CompareTo(Object obj)方法,添加到TreeSet中的对象必须继承了Comparable接口,并实现了其中的CompareTo方法。Java中一些常用类已经实现了该接口,例如String(Unicode),Boolean(true大于false)等。

即TreeSet只根据public int compareTo(Object obj)方法判断是否相等
  0:相等
  正整数:调用方法的对象大于obj
  负整数:调用方法的对象小于obj


3、实际我们比较对象一般使用equals,当equals返回的结果为相等时,认为两个对象相同。此时comparator的结果也应该为相等。HashSet的hashCode也应该相等。即避免存入相同的元素。


4、TreeSet类定制排序

TreeSet的自然排序时根据元素的大小按照升序排序。如果希望实现定制排序,例如降序排序,可以通过Comparator接口。该接口中声明了一个compare(T o1, T o2)方法:升序:该方法用于比较两个元素的大小,如果o1小于o2,返回一个负数;如果o1大于o2,返回一个正数;如果他们相等,则返回0。降序相反
按照需要复写Comparator接口中的compare方法,然后以Comparator实现类对象为参数,调用TreeSet的构造函数,建立Treeset集合,即可实现定制排序。

例如:分别按照工资降序排列:

package jnxy.com.cn;

public class Employee {
	private String name;
	private int salary;

	public Employee() {
		super();
	}

	public Employee(String name, int salary) {
		super();
		this.name = name;
		this.salary = salary;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getSalary() {
		return salary;
	}

	public void setSalary(int salary) {
		this.salary = salary;
	}

	public String toString() {
		return "姓名是:" + this.name + ",工资:" + this.salary;
	}

}
package jnxy.com.cn;

import java.util.Comparator;

public class SalaryComparator implements Comparator {

	@Override
	public int compare(Object o1, Object o2) {
		Employee employee1 = (Employee) o1;
		Employee employee2 = (Employee) o2;
		// return (p1.age>p2.age)?1:((p1.age==p2.age)?0:-1);
		int es1 = employee1.getSalary();
		int es2 = employee2.getSalary();
		if (es1 > es2)
			return -1;
		else if (es1 == es2)
			return 0;
		else
			return 1;

	}

}

package jnxy.com.cn;

import java.util.*;

public class TreeSetDemo {

	/**
	 * @author yn 按照工资的多少降序输出
	 */
	public static void main(String[] args) {
		SalaryComparator  sc=new SalaryComparator();
		@SuppressWarnings("unchecked")
		TreeSet<Employee> treeSet = new TreeSet<Employee>(sc);
		// 怎么让Employee对象实现Comparable接口
		Employee bb = new Employee("李四", 6000);
		Employee cc = new Employee("王五", 5600);
		Employee dd = new Employee("马六", 7500);
		Employee aa = new Employee("张三", 8000);

		treeSet.add(aa);
		treeSet.add(bb);
		treeSet.add(cc);
		treeSet.add(dd);
		// 怎样将员工的工资降序输出
		System.out.println(treeSet);
	}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值