TreeSet集合:可以对Set集合中的元素进行排序。是不同步的。
注:TreeSet集合判断元素唯一性的方式就是根据比较方法(compareTo)的返回结果是否是0,如果是0就是相同元素就不存。而不会判断hashCode和equals。
例:
import java.util.Iterator;
import java.util.TreeSet;
public class TreeSetDemo{
public static void main(String[] args){
TreeSet ts=new TreeSet();
ts.add("abc");
ts.add("zaa");
ts.add("abc");
ts.add("nba");
ts.add("cba");
Iterator it=ts.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
运行结果:
可以看到结果虽然无序,但是按照元素的指定顺序排序(本例中按照字母顺序进行排序)。
当我们在TreeSet集合中添加自定义对象时:
import java.util.Iterator;
import java.util.TreeSet;
class Person extends Object{
String name;
int age;
public Person(){
super();
}
public Person(String name,int age){
super();
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;
}
public int hashCode(){ //复写hashCode()
return name.hashCode()+age;
}
public boolean equals(Object obj){ //复写equals
if(this==obj) return true;
if(!(obj instanceof Person)) throw new ClassCastException("类型错误"); //输入类型错误
Person p = (Person)obj;//强制转换
return this.name.equals(p.name) && this.age==p.age; //说明姓名和年龄相同则为同一元素
}
}
public class TreeSetDemo{
public static void main(String[] args){
TreeSet ts=new TreeSet();
ts.add(new Person("zhangsan",28));
ts.add(new Person("wangwu",23));
ts.add(new Person("lisi",21));
ts.add(new Person("zhouqi",29));
ts.add(new Person("zhaoliu",25));
Iterator it=ts.iterator();
while(it.hasNext()){
Person p = (Person)it.next();
System.out.println(p.getName()+":"+p.getAge());
}
}
}
运行结果:
程序在主线程上发生了异常,这是因为在TreeSet集合中要对元素进行排序,所以在Person类中要有对元素进行比较的方法,而这个比较方法(compareTo)本身定义在Comparable接口中,因此要让Person类具备比较性,所以要对Person类功能扩展,让其实现Comparable接口,覆盖compareTo方法。
(引申:Comparable接口:此接口强行对实现它的每个类的对象进行整体排序,称为类的自然排序,类的compareTo方法被称为它的自然比较方法。)
修改代码:
import java.util.Iterator;
import java.util.TreeSet;
class Person extends Object implements Comparable{ //先继承后实现
String name;
int age;
public Person(){
super();
}
public Person(String name,int age){
super();
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;
}
public int compareTo(Object o){ //以Person对象的年龄进行从小到大的排序
Person p=(Person)o;
/* 此部分代码可被下两句代码替换
if(this.age>p.age) return 1; //返回正数
if(this.age<p.age) return -1; //返回负数
if(this.age==p.age){ //当主要条件相等时按次要条件排序
return this.name.compareTo(p.name); //String类中的compareTo方法
} */
int temp=this.age-p.age; //先按年龄排,再按姓名排
return temp==0?this.name.compareTo(p.name):temp;
/* 先按姓名排,再按年龄排
int temp=this.name.compareTo(p.name);
return temp==0?this.age-p.age:temp;
*/
}
}
public class TreeSetDemo{
public static void main(String[] args){
TreeSet ts=new TreeSet();
ts.add(new Person("zhangsan",28));
ts.add(new Person("wangwu",29));
ts.add(new Person("lisi",21));
ts.add(new Person("zhouqi",29));
ts.add(new Person("zhaoliu",25));
Iterator it=ts.iterator();
while(it.hasNext()){
Person p = (Person)it.next();
System.out.println(p.getName()+":"+p.getAge());
}
}
}
运行结果(先按年龄排,再按姓名排):