初识java集合——树集

*TreeSet与HashSet相比,树集是有序集合,对树集遍历,每个值将自动按照排序顺序呈现。
* TreeSet当前使用的是红黑树,每次将一个元素添加到树中时,都将被放置正确的位置之中
*
* 在TreeSet中添加元素的速度要快于数组和链表,但慢于散列表(HashSet)
*
* TreeSet在默认情况下,假定插入的元素实现了Comparable接口,该接口值返回负数,表明a位于b之前
*
* public interface Comparable<T>
* {
* int compareTo( T other);
* }
*
* 使用Comparable接口定义的排序有其局限性
* 如果要插入自定义的对象,就必须实现Comparable接口定义排列顺序
* 这里有一个问题需要思考,如果在一个集合中需要按照某一种规则,在另外一个集合却使用另一种规则
* 而如果要对一个类的对象进行排序,该类并没有实现Comparable接口,这时候怎么办?
*
* 此时,可以将Comparator对象传递给TreeSet的构造器来告诉使用该种排列规则
*
* public interface Comparator<T>
* {
* int compara(T a, T b);
* }
*

 1 //例子
 2 class  myComparator implements Comparator<String>{
 3
 4     @Override
 5     public int compare(String o1, String o2) {
 6         if (o1.length() > o2.length()) {
 7             return 1;
 8         }else if( o1.length() < o1.length()){
 9             return -1;
10         }else{
11             return 0;
12         }
13     }
14 };
15
16 //然后将构造的比较器传入
17 myComparator my = new myComparator();
18 TreeSet<String> tree = new TreeSet<>(my);

* 如果按照描述信息进行排序就如 例子一样, 然后将类的对象传递树集的构造器,这样就构造了一颗带比较的树
* 注意到,这个比较器没有任何数据,它只是比较方法的持有器(有时将这种对象称为函数对象)
* 函数对象通常动态定义,即常常用匿名内部类,如例子2
*

//例子2
TreeSet<Student> stuTree = new TreeSet<Student>(new Comparator<Student>(){
    @Override
    public int compare(Student o1, Student o2) {
        if (o1.getBook().getPrice() > o2.getBook()
                .getPrice()) {
            return -1;
        } else if (o1.getBook().getPrice() < o2
                .getBook().getPrice()) {
            return 1;
        } else {
            return 0;
        }
    }
});

* 如果不需要进行排序,那么没必要为排序开销,对于某些数据来说,对其排序比散列函数更加困难
*

时间: 2024-08-05 12:43:27

初识java集合——树集的相关文章

初识Java集合框架(Iterator、Collection、Map)

1. Java集合框架提供了一套性能优良.使用方便的接口和类,它们位于java.util包中 注意: 既有接口也有类,图中画实线的是类,画虚线的是接口 使用之前须要到导入java.util包 List和Set是Collection的子接口,ArrayList和LinkedList是List的两个实现类,HashSet和TreeSet是Set的两个实现类 重点:ArrayList.LinkedList和HashSet Map接口对应的集合是以K-V键值对的方式存储数据的,不同于Collection

初识java集合——映射表(Map)

*映射表 * java类库为映射表提供了两个通用的实现 HashMap和TreeMap * HashMap对键进行散列,TreeMap用键的整体顺序对元素进行排序,构建成搜索树 * * 与Set相似,HashMap的速度要比TreeMap要快一点,同时不需要按照排列访问,也应该选择HashMap * 注意,键的值必须是唯一的,如果第二次put了一个同样的键值进去,第二次的值会取代第一次的值,put会 * 返回用这个键参数存储的上一个值 * * 我们可以获取Map的视图,这是一组实现了Collec

初识java集合——迭代器

* Collection接口中有2个基本的方法 * add和iterator * * add(E e)是用于向集合中添加元素,如果添加元素成功,则返回true, 反之为false(例如向集里面添加,因为集是不允许重复的) * * Iterable接口只包含了一个方法 * Iterator<E> iterator(); * 编译器将foreach循环翻译为带有迭代器的循环 * foreach可以与任何实现了Iterable接口的对象一起工作 * Collection接口扩展了Iterable接口

初识java集合——链表

* 链表中的每个节点,存放着上一个节点的引用和下一个节点的引用 * 相对于泛型集合,链表是一个有序集合,每个对象的位置十分的重要 * 链表的add默认也是添加到尾部的 * * 链表的添加删除操作往往借助迭代器来完成,参见IteratorIntro * * 对于链表的遍历,绝对不要使用(代码区-1)的方式,例如get(3),要从头开 * 始到3的索引,get(7),又得从头开始到7的位置,效率非常的低. * 因为LinkedList对象不做任何缓存位置信息操作 * //代码区-1 for( int

初识java集合——散列表(HashTable)

[散列表]为每个对象计算一个整数,称为散列码(是由对象的实例域产生的一个整数)更确切的说 * 不同实例域的对象产生不同的散列码 * * 如果自定义类,就要负责实现这个类的hashcode,注意:自己实现的hashcode方法应该与equals方法兼容 * 即如果a.equals(b) 为true a和b必须具有相同的散列码 * * 在java中,[散列表]用链表数组实现.每个列表被称为桶.想要查找表中对象,先计算散列码,然后与桶的总数取余 * 所的余数就是桶的索引.当桶中没有其他元素时,很幸运可

初识java集合——其他集合

* 弱散列映射表(WeakHashMap) * 如果有一个值,对应的键已经不再使用了,将会出现什么情况呢 * 假定对某个键的而最后一次引用已经消亡,不再有任何途径引用这个值对象了,但是由于程序中任何 * 部分没有再引用这个键,所以这个键/值无法从Map中删除. * 遗憾的是,垃圾回收器跟踪活动的对象,只要Map对象时活动的,其中的所有桶也都是活动的,它们不能被回收. * 当对键的唯一引用来自散列表条目时,这一数据结构将于垃圾回收器协同工作一起删除键/值对 * * 下面是对于[弱散列映射表]的机制

初识java集合——队列

有两个端头的队列,称为双端队列.可以让人们有效的在头部和尾部同时添加或删除元素 * 不支持在队列中间添加元素 * *[ 优先级队列] * 可以按照任意的顺序插入,却总是按照排序的顺序进行检索,无论何时调用remove,返回的是 * 当前优先队列中最小的元素,然而优先级队列并没有对所有元素进行排序 * 如果用迭代器的方式,处理这些元素,并不需要对他们进行排序 * * 优先级队列使用了堆(heap)这个优雅高效的数据结构,对树执行添加和删除操作时,最小的元素总能 * 移动到根节点 * * 与Tree

跟王老师学集合(一)为什么要使用集合和Java集合概述

为什么要使用集合和Java集合概述 主讲人:王少华  QQ群号:483773664 学习目标 1 理解为什么使用集合 2 掌握Java集合框架 一.使用数组缺陷: 在电子宠物系统中,如果想存储多个宠物信息,可以使用数组来实现.例如,可以定义一个长度50的Dog类型的数组,存储多个Dog对象的信息.但是采用数组存在以下一些明显的缺陷: 数组长度固定不变,不能很好适应元素数量动态变化的情况.若要存储大于50个狗狗的信息,则数组长度不足:若只存储20个狗狗的信息,则造成内存空间浪费 可通过数组名.le

Scala集合和Java集合对应转换关系

作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 用Scala编码的时候,经常会遇到scala集合和Java集合互相转换的case,特意mark一下,加深记忆 scala.collection.Iterable <=> java.lang.Iterable scala.collection.Iterable <=> java.util.Collection scala.collection.Iterator <=>