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

6 Responses so far.

  1. quest bars says:
    I don’t even know the way I ended up here, but I assumed
    this publish was good. I do not know who you might be however definitely you are
    going to a famous blogger for those who are
    not already. Cheers!
  2. Quest Bars says:
    I’d like to find out more? I’d care to find out some additional information.
  3. Outstanding post, I think website owners should acquire a lot from this site its very user genial.
  4. Cindy says:
    asc waan idin salamay aqyaarta reer somaliska waxaan aad ugu qoslay walasheey muniira kkkkkkk cadi matahid runta isakhseegaU codee: 0  1

Leave a Reply to quest bars Cancel reply