黑马程序员——TreeSet集合

------- android培训、java培训、期待与您交流! ----------

TreeSet

TreeSet是集合框架体系中的一员,是存储对象的一种方式,长度可变,可存储不同类型的对象。元素是无序的,不可重复。底层数据结构是二叉树,可以用TreeSet对集合中的元素进行排序。

P.S.  集合存的都是对象。存储基本数据类型值,会自动装箱封装成对应的基本数据类型对象包装类对象。

TreeSet判断元素唯一性的方式:就是根据比较方法的返回结果是否是0,是0,就是相同元素,不存。



TreeSet排序的第一种方式:让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo方法。也种方式也成为元素的自然顺序,或者叫做默认顺序。

/*

需求:
往TreeSet集合中存储自定义对象学生。
想按照学生的年龄进行排序,年龄相同按姓名排。


*/

class TreeSetDemo 
{
	public static void main(String[] args) 
	{
		TreeSet ts = new TreeSet();//定义TreeSet集合
		ts.add(new Student("杰克",22));
		ts.add(new Student("杰克007",20));
		ts.add(new Student("皮特",19));
		ts.add(new Student("小明",19));
		ts.add(new Student("杰克007",20));//没存进去
		//迭代器,用于取出集合中的元素
		Iterator it = ts.iterator();
		while(it.hasNext())
		{
			Student stu = it.next();
			System.out.println(stu.getName()+"..."+stu.getAge());
		}
	}
}


class Student implements Comparable//该接口强制让学生具备比较性。
{
	private String name;
	private int age;

	Student(String name,int age)
	{
		this.name = name;
		this.age = age;
	}

	public int compareTo(Student s)
	{

		int temp = this.age - s.age;//先比较年龄
		return temp == 0?this.name.compareTo(s.name):temp//年龄相同比姓名
	}

	public String getName()
	{
		return name;

	}
	public int getAge()
	{
		return age;
	}
}

注意: 1.排序时,当主要条件相同时,一定判断一下次要条件。

2.在使用迭代器迭代时,不可以通过集合对象的方法操作集合中的元素,只能使用迭代器的方法操作。(如不可使用add(e),会产生异常,要小心)


TreeSet的第二种排序方式。当元素自身不具备比较性时,或者具备的比较性不是所需要的。这时就需要让集合自身具备比较性。这样在集合初始化时,就有了比较方式。

/*
练习:按照字符串长度排序。

字符串本身具备比较性。但是它的比较方式不是所需要的。

这时就只能使用比较器。

*/

import java.util.*;
class  TreeSetTest
{
	public static void main(String[] args) 
	{
		TreeSet ts = new TreeSet(new StrLenComparator());
		//定义TreeSet集合传入比较器对象
		ts.add("abcd");
		ts.add("qw");
		ts.add("cbedaasa");
		ts.add("aaa");
		ts.add("k");
		ts.add("hahaha");

		Iterator it = ts.iterator();

		while(it.hasNext())
		{
			System.out.println(it.next());
		}
	}
}

class StrLenComparator implements Comparator//定义比较器比较字符串
{
	public int compare(String s1,String s2)//比较长度,长度相同按字符自然顺序比
	{					
		int num = s1.length()-s2.length();
		if(num==0)
			return s1.compareTo(s2);
		return num;
	}
}


注意:当两种排序都存在时,以 比较器为主


你可能感兴趣的:(黑马程序员——TreeSet集合)