------- 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;
}
}