java 孙鑫 第六课(第三部分)TreeSet介绍

 

TreeSet介绍:第六课F 5087

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;

           }

      }

}

上面如果只使用学号排序,那么学号相同的就不会被打印的。

问题 :如果不用内部类实现比较器,该怎么做???

HashSetTreeSet的区别:

HashSet是基于hash算法实现的,性能优于TreeSet。通常使用HashSet,在我们需要对其中元素排序的时候才使用TreeSet

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值