TreeSet是通过红黑二叉树的结构对那些可“排序”的对象进行存放的。
TreeSet:排序的功能,利用二叉数(红黑树)进行排序的.它是根据比较器返回的值来确定顺序的,
* 如果返回值是正数则大,负数表示小,0表示相等.所以放进TreeSet集合里的数据要么
* 实现Comparable接口,让数据本身具有比较性.或者让容器有比较性。
TreeSet根据比较器判断是否重复和进行排序.如果容器和数据都具有比较性,则优先使用容器的比较器.
* 1:对象具有比较性,让对象所属的类实现Comparable接口,重写compareTo方法.
* 2:容器(TreeSet)比较比较性,可以写一个类实现Comparator接口,重写compareTo方法,将这个类的对象传给容器的构造方法
TreeSet可以用在排序方面如:
/*1.TreeSet练习
人类,属性姓名,收入,年龄,书,
书类:属性书名,价格
存储TreeSet<Person>集合,排序规则:
A:先按照收入排序:从高到低
B:收入相等的情况下,按照年龄排序:从小大大
C:如果收入和年龄都相等,按照姓名排序,字典顺序(String类的compareTo方法)
D:如果以上3个属性都相等,按照书排序,先按照书价格:从低到高,如果书价格相等,按照书名(字典顺序)。
2.利用自定义比较器完成上题。(使用匿名内部类)*/
import java.util.*;
import java.util.TreeSet;
import java.util.Comparator ;
import java.util.Iterator;
public class Test
{
public static void main (String []args)
{
TreeSet<Person> ts=new TreeSet<Person>(new Mycomparator());
ts.add(new Person("g",42,1800,new Literature("book-b",34)));
ts.add(new Person("a",33,1700,new Literature("book-b",44)));
ts.add(new Person("a",39,1700,new Literature("book-b",24)));
ts.add(new Person("d",33,1300,new Literature("book-d",14)));
ts.add(new Person("c",33,1300,new Literature("book-s",60)));
ts.add(new Person("c",33,1300,new Literature("book-f",90)));
ts.add(new Person("c",33,1300,new Literature("book-g",90)));
ts.add(new Person("a",44,20000,new Literature("book-a",64)));
Iterator<Person> it=ts.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
}
//定义一个比较器,
class Mycomparator implements Comparator<Person>
{
//A:先按照收入排序:从高到低
//B:收入相等的情况下,按照年龄排序:从小大大
//C:如果收入和年龄都相等,按照姓名排序,字典顺序(String类的compareTo方法)
//D:如果以上3个属性都相等,按照书排序,先按照书价格:从低到高,如果书价格相等,按照书名(字典顺序)。
//思路:这种情况应该用if-else实现分支对应不同情况
public int compare (Person p1,Person p2)
{
if(p1.sal!=p2.sal)
return p2.sal-p1.sal;
else if(p2.age!=p1.age)
return p1.age-p2.age;
else if(! p1.name.equals(p2.name))
return p1.name.compareTo(p2.name);
else if(p1.lt.price!=p2.lt.price)
return p1.lt.price-p2.lt.price;
else
return p1.lt.bookname.compareTo(p2.lt.bookname);
// return 0;
}
}
class Person
{
String name;
int age;
int sal;
Literature lt;
public String toString ()
{
return this.name+" 人士,收入:"+this.sal+"元,年龄:"+this.age+" 岁,书价格:"+this.lt.price+"元,书名:"+this.lt.bookname ;
}
public Person (String name, int age, int sal,Literature lt)
{
this.name=name;
this.age=age;
this.sal=sal ;
this.lt=lt;
}
public Person ()
{
}
}
class Literature
{
String bookname;
int price;
public Literature(String bookname ,int price)
{
this.bookname=bookname;
this.price=price;
}
}
容器具有比较性。
TreeSet提供了一个构造方法用于用指定的comparator比较器去比较那些可“排序”的对象,直接匿名comparetor,或者用一个类去实现继承它。
1 /*
2 * 对字符串进行长度排序
3 * aa a bbb cccd ddddt eeeeee
4 * a aa bbb cccd ddddt eeeeee
5 *
6 */
7 import java.util.TreeSet;
8 import java.util.Iterator;
9 import java.util.*;
10 public class Demo4
11 {
12 public static void main (String []args)
13 {
14 TreeSet<String> tset=new TreeSet<String >(new Comparator<String>(){
15 public int compare(String str1,String str2)
16 {
17 return str1.length()-str2.length();
18 }
19 } );
20 tset.add("aaaa");
21 tset.add("a");
22 tset.add("aaaaaaaa");
23 Iterator it=tset.iterator();
24 while(it.hasNext())
25 {
26 System.out.println(it.next());
27 }
28 }
29 }
//
//让类(比较器)去实习Comparator接口,再新建TreeSet时向构造方法传入这个比较器。
//
import java.util.TreeSet;
import java.util.Iterator;
import java.util.Comparator;
public class Demo5
{
public static void main (String []args)
{
TreeSet<String> ts=new TreeSet<String> (new MyComparator());
ts.add("aaaaaa");
ts.add("bbb");
ts.add("cccccccc");
Iterator<String> it=ts.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
}
class MyComparator implements Comparator<String>
{
public int compare(String str1,String str2)
{
return str1.length()-str2.length();
}
}
数据具有比较性。
对那些可“排序”的类,先进行排序,在存放入TreeSet里
//狗比较比较性,实现Comparable接口.重写compareTo这个方法.
public class Dog implements Comparable<Dog> {
@Override
public boolean equals(Object obj) {
Dog dog = (Dog)obj;
if(dog.getAge()==this.getAge() && dog.getKind().equals(this.getKind()) && dog.getName().equals(this.getName()))
return true;
else
return false;
}
@Override
public int compareTo(Dog o) {
// TODO Auto-generated method stub
//年龄 如果当前对象的年龄比传进来的对象的年龄大,则返回正数.小则返回负数,否则返回0
if(this.getAge()>o.getAge()){
return 1;
}else if(this.getAge()==o.getAge()){
return 0;
}else
return -1;
}
}