六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 40|回复: 0

java TreeSet 的基础使用

[复制链接]

升级  3.33%

15

主题

15

主题

15

主题

秀才

Rank: 2

积分
55
 楼主| 发表于 2013-2-3 14:36:12 | 显示全部楼层 |阅读模式
TreeSet是依靠TreeMap来实现的
TreeSet是一个有序集合,她的元素 按照升序排列,默认是按照自然顺序排列,也就是说TreeSet中的对象元素需要实现Comparable接口。
TreeSet类中跟HashSet类一样也没有get()方法来获取列表中的元素,所以也只能通过迭代器方法来获取。

Java代码  
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对象时传递一个比较器来实现你自己的排序方式:
Java代码  
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());  
           }  
      }  
}  


Student类:
Java代码  
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;  
           }  
      }  
}  


上面如果只使用学号排序,那么学号相同的就不会被打印的。
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表