TreeSet
TreeSet可以给Set集合中的元素进行指定顺序的排序。默认情况下是通过元素的自然顺序进行排序。
TreeSet保证元素唯一性的依据:比较方法的返回结果是否是0,如果是0,则存在相同元素,不再存入TreeSet。
TreeSet排序方式一:
让元素自身具备可比较性,需要实现Comparable接口,重写compareTo方法,这种排序方式是按照自然顺序进行的排序。
TreeSet排序方式二:
让容器自身具有比较性。容器一初始化就具备比较功能。因为容器是在对象构造的时候初始化。
构造方法TreeSet(Comparator),在容器初始化时指定一个比较器,这种方法称为比较器排序。需要实现Comparator接口,重写compare方法。
例1:采用自然顺序进行排序(先按年龄排序,如果年龄一样再按照姓名排序)
Person类 Person.java
/*
*Created on 2016年6月1日
*Copyright 2016 Yong Cai Limited crop. All Rights Reserved
*
*728**80@qq.com
*/
package treeset;
public class Person implements Comparable<Person>{
String name;
int age;
public Person(String name, int age){
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return this.name + ":" + this.age;
}
@Override
public int compareTo(Person o) {
int temp = this.age - o.age;
return temp == 0?this.name.compareTo(o.getName()):temp;
}
}
TreeSetTest类 TreeSetTest.java
/*
*Created on 2016年6月1日
*Copyright 2016 Yong Cai Limited crop. All Rights Reserved
*
*728**80@qq.com
*/
package treeset;
import java.util.Iterator;
import java.util.TreeSet;
public class TreeSetTest {
public static void main(String[] args) {
Person p1 = new Person("nameee", 11);
Person p2 = new Person("name1", 11);
Person p3 = new Person("name1", 16);
Person p4 = new Person("name4", 100);
Person p5 = new Person("name0", 100);
TreeSet<Person> ts = new TreeSet<Person>();//自然顺序进行排序
//TreeSet<Person> ts = new TreeSet<Person>(new CompareByName());//使用比较器进行排序
ts.add(p1);
ts.add(p2);
ts.add(p3);
ts.add(p4);
ts.add(p5);
Iterator<Person> iter = ts.iterator();
while (iter.hasNext()) {
Person person = iter.next();
System.out.println(person.toString());
}
}
}
运行结果:
name1:11
nameee:11
name1:16
name0:100
name4:100
例2:使用比较器进行排序(先按姓名排序,如果姓名一样再按照年龄排序)
CompareByName.java
/*
*Created on 2016年6月1日
*Copyright 2016 Yong Cai Limited crop. All Rights Reserved
*
*728**80@qq.com
*/
package treeset;
import java.util.Comparator;
public class CompareByName implements Comparator{
@Override
public int compare(Object o1, Object o2) {
Person p1 = (Person)o1;
Person p2 = (Person)o2;
int temp = p1.getName().compareTo(p2.getName());
return temp==0?p1.getAge() - p2.getAge():temp;
}
}
运行结果:
name0:100
name1:11
name4:100
nameee:11