读书人

【转】JAVA TreeSet的应用

发布时间: 2012-12-20 09:53:21 作者: rapoo

【转】JAVA TreeSet的使用

TreeSet是依靠TreeMap来实现的
TreeSet是一个有序集合,她的元素 按照升序排列,默认是按照自然顺序排列,也就是说TreeSet中的对象元素需要实现Comparable接口。
TreeSet类中跟HashSet类一样也没有get()方法来获取列表中的元素,所以也只能通过迭代器方法来获取。
import java.util.*;
public class TreeSetTest
{
????? public static void main(String[] args)
????? {
?????????? TreeSet tr =new TreeSet();
?????????? tr.add("zhangshan");
?????????? tr.add("wangwu");
?????????? tr.add("lisi");
?????????? Iterator it =tr.iterator();
?????????? while(it.hasNext())
?????????? {
???????????????? System.out.println(it.next());
?????????? }
????? }
}
上面打印结果为:lisi wangwu zhangshan 这时因为TreeSet是一个有序并且默认按自然顺序排列,而不像哈希表那样毫无规律。
上面向TreeSet中添加的对象好像没有实现Comparable接口哦??那是因为添加的是String对象,而String类已经实现了Comparable接口。
????? 当然,你也可以在创建TreeSet对象时传递一个比较器来实现你自己的排序方式:
import java.util.*;
public class TreeSetTest
{
????? public static void main(String[] args)
????? {
?????????? //传递一个比较器来实现你自己的排序方式
?????????? TreeSet tr =new TreeSet(new Student.StudentComparator());
?????????? tr.add(new Student(3,"wnagwu"));
?????????? tr.add(new Student(2,"zhangshan"));
?????????? tr.add(new Student(2,"lisi"));
?????????? tr.add(new Student(1,"xiejin"));
?????????? Iterator it =tr.iterator();
?????????? while(it.hasNext())
?????????? {
???????????????? System.out.println(it.next());
?????????? }
????? }
}
class Student implements Comparable,Comparator
{
????? int num;
????? String name;
????? Student(int num,String name)
????? {
?????????? this.num=num;
?????????? this.name=name;
????? }
????? public int compareTo(Object o)
????? {
?????????? Student st =(Student)o;
?????????? int result;
?????????? result= num>st.num?1:(num==st.num?0:-1);
?????????? //如果学号相等,就按姓名排列
?????????? /*if(result==0)
?????????? {
???????????????? return name.compareTo(st.name);
?????????? }*/
?????????? return result;
????? }
????? //实现Comparator接口并实现它的抽象方法
????? public int compare(Object o1,Object o2)
????? {
?????????? Student st1 =(Student)o1;
?????????? Student st2 =(Student)o2;
?????????? return st1.name.compareTo(st2.name);
?????
????? }
????? //重写toString()方法,因为如果不重写,打印出来的是16进制代码
????? public String toString()
????? {
?????????? return "num="+num+"; name="+name;
????? }
????? public static class StudentComparator implements Comparator
????? {
?????????? public int compare(Object o1,Object o2)
?????????? {
???????????????? Student st1 =(Student)o1;
???????????????? Student st2 =(Student)o2;
???????????????? int result;
???????????????? result=st1.num>st2.num?1:(st1.num==st2.num?0:-1);
???????????????? if(result==0)//如果学号相等 就进行名字排序
???????????????? {
????????????????????? result=st1.name.compareTo(st2.name);
???????????????? }
???????????????? return result;
?????????? }
????? }
}
上面如果只使用学号排序,那么学号相同的就不会被打印的。
问题 :如果不用内部类实现比较器,该怎么做???
HashSet与TreeSet的区别:
HashSet是基于hash算法实现的,性能优于TreeSet。通常使用HashSet,在我们需要对其中元素排序的时候才使用TreeSet。

来源:http://blog.csdn.net/wzwjr/archive/2008/12/27/3618195.aspx

读书人网 >编程

热点推荐