了解TreeSet集合

TreeSet类是Set接口的另一个是实现类,TreeSet集合和HashSet集合都可以保证容器内元素的唯一性,但是他们的底层实现方式不同,TreeSet底层使用自平衡的排序二叉树实现的,所以它既能保证元素的唯一性,也可一堆元素进行排序。
TreeSet还提供了一些特有的方法,如下所示:

  • Comparator comparator():如果TreeSet采用定制排序,则返回定制排序所使用的Comparator;如果TreeSet采用自然排序,则返回null。
  • Object first():返回集合中的第一个元素。
  • Object last():返回集合中最后的一个元素。
  • Object lower(Object obj):返回集合中位于obj之前的元素。
  • Object higher(Object obj):返回集合中位于obj之后的元素。
  • SortedSet subset(Object obj1,Object2):返回此Set的子集合,范围从obj1到obj2。
  • SortedSet headset(Object obj):返回此Set的子集合,返回小于obj。
  • SortedSet tailSet(Object obj):返回此Set的子集合,返回大于或等于元素obj。

接下来通过一个demo来了解一下TreeSet。

import java.util.TreeSet;

public class TestTreeSet {
	public static void main(String[] args) {
		TreeSet treeSet=new TreeSet();
		treeSet.add(60);
		treeSet.add(360);
		treeSet.add(120);
		System.out.println(treeSet);
		System.out.println(treeSet.subSet(100, 500));
	}

}

运行结果:

在这里插入图片描述

运行结果说明TreeSet中元素是有序的,且这个顺序不是添加时的顺序,是根据元素实际值的大小进行排序的。
TreeSet有两种排序方法:自然排序和定制排序。默认情况下,TreeSet采用的是自然排序。

1、自然排序
TreeSet类会调用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后将集合内元素按升序排列,这就是自然排序。
Java提供了Comparable接口,他里面定义了一个compareTo(Object obj)方法,实现Comparable接口时必须要实现该方法,在方法中实现对象比较。当该方法被调用时,例如obj1.compareTo(obj2),若该方法返回0,则说明obj1和obj2相等;若返回一个正整数,则说明obj1大于obj2;若该方法返回一个负整数,则说明obj1小于obj2.

另外,向TreeSet集合中添加的应该是同一个类的对象,否则会报ClassCastException异常。

2、定制排序
TreeSet的自然排序是根据集合元素大小,按升序排序,如果需要按特殊规则排序或者元素自身不具备比较性时,就需要用到定制排序,比如按降序排列。Comparator包含一个int compare(T t1,T t2)方法,该方法可以比较t1和t2大小,若返回正整数,则说明t1大于t2;若返回0,则说明t1等于t2;若返回负整数,则说明t1小于t2。
实现TreeSet的定制排序时,只需要在创建TreeSet集合对象时,提供一个Comparator对象于该集合关联,在compare中编写排序逻辑。
接下来以一个案例来演示:

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


class Student{
	private Integer age;

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	public Student(Integer age) {
		this.age = age;
	}
	public String toString() {
		return age+"";
	}
	
}

class MyComparator implements Comparator{    //第一步:实现Comparator接口
	//第二步:实现一个compare方法,判断对象是否特定类的一个实例
	public int compare(Object o1,Object o2) {   
		if(o1 instanceof Student & o2 instanceof Student) {
			Student s1=(Student)o1;  //强制转换为Student类型
			Student s2=(Student)o2;
			if(s1.getAge()>s2.getAge()) {
				return -1;
			}
			else if(s1.getAge()<s2.getAge()){
				return 1;
			}
		}
		return 0;
	}
}

public class TestTreeSetSort {
	public static void main(String[] args) {
		//第三步:创建一个TreeSet集合对象时,提供一个Comparator对象
		TreeSet treeSet=new TreeSet(new MyComparator());  
		treeSet.add(new Student(140));
		treeSet.add(new Student(12));
		treeSet.add(new Student(15));
		System.out.println(treeSet);
	}
}

运行结果:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章