集合框架--TreeSet集合

来源:互联网 发布:能听着背单词的软件 编辑:程序博客网 时间:2024/05/26 07:28

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){  //复写equalsif(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());}}}

运行结果(先按年龄排,再按姓名排):


0 0
原创粉丝点击