TreeSet树集

一.特性

  • TreeSet集与散列集十分类似,不过,它比散列集有所改进。TreeSet是一个有序集合。可以以任意顺序将元素插入到集合中。在对集合进行遍历时,每个值将自动地按照排序后的顺序呈现。
  • 如,插入3个字符串,然后访问添加的所有元素。
public class TreeSetTest {
    public static void main(String[] args) {
        TreeSet<String> sorter = new TreeSet<>();
        sorter.add("Bob");
        sorter.add("Amy");
        sorter.add("Carl");
        for (String str : sorter) {
            System.out.println(str);
        }
    }
}

直接输出结果

  • 正如TreeSet类名所示,排序是用树结构完成的(当前实现使用的是红黑树)。每次将一个元素添加到树中时,都被放置在正确的排序位置上。因此迭代器总是以排好序的顺序访问每个元素。因此,将一个元素添加到树中要比添加到散列表中慢。
    将元素添加到散列集和树集
  • 如果不需要对数据进行排序,就没有必要付出排序的开销。更重要的是,对于某些数据来说,对其排序要比散列函数更加困难。散列函数只是将对象适当地打乱存放,而此比较却要精确地判别每个对象。
  • 要使用树集,必须能够比较元素。这些元素必须实现Comparable接口。

二.实例

  • 自定义Item类,重写了toString,equals,hashCode,compareTo方法。其中toString,equals,hashCode可以使用IDE工具生成。
public class Item implements Comparable<Item>
{
   private String description;
   private int partNumber;

   public Item(String aDescription, int aPartNumber)
   {
      description = aDescription;
      partNumber = aPartNumber;
   }

   public String getDescription()
   {
      return description;
   }

   //重写toString方法
   public String toString()
   {
      return "[description=" + description + ", partNumber=" + partNumber + "]";
   }

   //重写equals方法
   public boolean equals(Object otherObject)
   {
      if (this == otherObject) return true;
      if (otherObject == null) return false;
      if (getClass() != otherObject.getClass()) return false;
      Item other = (Item) otherObject;
      return Objects.equals(description, other.description) && partNumber == other.partNumber;
   }
   
   public int hashCode()
   {
      return Objects.hash(description, partNumber);
   }
   
   //重写compareTo接口
   public int compareTo(Item other)
   {
      //首先比较partNumber
      int diff = Integer.compare(partNumber, other.partNumber);
      //如果partNumber相等,再比较descriptioin
      return diff != 0 ? diff : description.compareTo(other.description);
   }
}
public class TreeSetTest
{
   public static void main(String[] args)
   {
      SortedSet<Item> parts = new TreeSet<>();
      parts.add(new Item("Toaster", 1234));
      parts.add(new Item("Widget", 4562));
      parts.add(new Item("Modem", 9912));
      System.out.println(parts);

      NavigableSet<Item> sortByDescription = new TreeSet<>(
            Comparator.comparing(Item::getDescription));

      sortByDescription.addAll(parts);
      System.out.println(sortByDescription);
   }
}

三.Set集合下的常用类

  • SortedSet中的元素无序不可重复,但是存进去的元素可以按照元素大小顺序自动排序。
//返回用于对元素进行排序的比较器。如果元素用Comaparable接口的compareTo方进行比较则返回null
Comparator<? super E> comparator()
//返回有序集中的最小元素
E first()
//返回有序集中的最大元素
E last()
  • NavigableSet扩展了 SortedSet,具有了为给定搜索目标报告最接近匹配项的导航方法。
//返回大于value的最小元素,如果没有这样的元素则返回null
E higher(E value)
//返回大于value的最大元素,如果没有这样的元素则返回null
E lower(E value)
//返回大于等于value的最小元素,如果没有这样的元素则返回null
E ceiling(E value)
//返回小于等于value的最大元素,如果没有这样的元素则返回null
E floor(E value)
//删除并返回这个集中的最大元素,这个集为空时返回null
E pollFirst()
//删除并返回这个集中的最小元素,这个集为空时返回null
E pollLast()
//返回一个按照递减顺序遍历集中元素的迭代器
Iterator<E> descendingIterator()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值