黑马程序员——TreeSet集合

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

TreeSet

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

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

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



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

/*

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


*/

class TreeSetDemo 
{
	public static void main(String[] args) 
	{
		TreeSet<Student> ts = new TreeSet<Student>();//定义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<Student> it = ts.iterator();
		while(it.hasNext())
		{
			Student stu = it.next();
			System.out.println(stu.getName()+"..."+stu.getAge());
		}
	}
}


class Student implements Comparable<Student>//该接口强制让学生具备比较性。
{
	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<String> ts = new TreeSet<String>(new StrLenComparator());
<span style="white-space:pre">		</span>//定义<span style="font-family: Arial, Helvetica, sans-serif;">TreeSet</span>集合传入比较器对象
		ts.add("abcd");
		ts.add("qw");
		ts.add("cbedaasa");
		ts.add("aaa");
		ts.add("k");
		ts.add("hahaha");

		Iterator<String> it = ts.iterator();

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

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


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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值