`
winnie825
  • 浏览: 120208 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

TreeSet研究

 
阅读更多

 

TreeSet拥有和Set的基础属性:不能重复。

同时它还拥有一个隐藏排序功能。

 

public class RandomTest {

    public static void main(String[] args) {
        Random random = new Random();
        Set<Integer> set = new TreeSet<Integer>();

        while (set.size() != 6) {
            // 获取随机数
            int randomValue = random.nextInt(33) + 1;
            
            System.out.print(randomValue + " ");
            
            // 写入TreeSet集合
            set.add(randomValue);
        }
        System.out.println("\n------------");
        Iterator it = set.iterator();
        
        // 输出TreeSet内容
        while (it.hasNext()) {
            System.out.print(it.next() + " ");
        }
    }
}

 

 输出

 

 

15 4 23 4 9 19 8 
------------
4 8 9 15 19 23

 

 

 

在随机数放入TreeSet之后,再次输出时进行了排序。

看TreeSet的源码的add方法

 

public boolean add(E o) {
	return m.put(o, PRESENT)==null;
}

 

 再看m和PRESENT是什么

 

 

private transient SortedMap<E,Object> m; // The backing Map
private static final Object PRESENT = new Object();

 

 看m的初始化

 

public TreeSet() {
	this(new TreeMap<E,Object>());
}

 

 基本明白了,TreeSet是实际上使用了一个含排序功能的TreeMap存放的数据,key是Set集合中的元素,value是一个虚拟Object。

 

看TreeMap的put方法

 

    public V put(K key, V value) {
        Entry<K,V> t = root;

        if (t == null) {
            incrementSize();
            root = new Entry<K,V>(key, value, null);
            return null;
       }

        while (true) {
            int cmp = compare(key, t.key);
            if (cmp == 0) {
                return t.setValue(value);
            } else if (cmp < 0) {
                if (t.left != null) {
                    t = t.left;
                } else {
                    incrementSize();
                    t.left = new Entry<K,V>(key, value, t);
                    fixAfterInsertion(t.left);
                    return null;
                }
            } else { // cmp > 0
                if (t.right != null) {
                    t = t.right;
                } else {
                    incrementSize();
                    t.right = new Entry<K,V>(key, value, t);
                    fixAfterInsertion(t.right);
                    return null;
                }
            }
        }
    }

 它进行了排序,但排序的关键是compare方法,该方法制定和TreeMap的key值顺序,也就是TreeSet的元素顺序

    private Comparator<? super K> comparator = null;

    private int compare(K k1, K k2) {
        return (comparator==null ? ((Comparable</*-*/K>)k1).compareTo(k2)
                                 : comparator.compare((K)k1, (K)k2));
    }

 如果我们想要修改TreeSet的排序,那么需要重写TreeMap的compare方法,即自定义comparator,其实TreeMap和TreeSet已经提供了入口

    public TreeSet(Comparator<? super E> c) {
		this(new TreeMap<E,Object>(c));
    }
    public TreeMap(Comparator<? super K> c) {
        this.comparator = c;
    }

 修改一下之前的代码,我们自定义Comparator,让TreeSet的元素倒序输出

public class RandomTest {

    public static void main(String[] args) {
        Random random = new Random();
        // 自定义的Comparater
        MyComparater comparater = new MyComparater();
        
        // 使用指定的构造方法
        Set<Integer> set = new TreeSet<Integer>(comparater);

        while (set.size() != 6) {
            // 获取随机数
            int randomValue = random.nextInt(33) + 1;
            
            System.out.print(randomValue + " ");
            
            // 写入TreeSet集合
            set.add(randomValue);
        }
        System.out.println("\n------------");
        Iterator it = set.iterator();
        
        // 输出TreeSet内容
        while (it.hasNext()) {
            System.out.print(it.next() + " ");
        }
    }
}


class MyComparater implements Comparator<Integer>{

    public int compare(Integer o1, Integer o2) {
        int val1 =  o1.intValue();
        int val2 =  o2.intValue();
        return (val1 > val2 ? -1 : (val1 == val2 ? 0 : 1));
    }

}

输出:

3 16 16 25 5 3 21 11 
------------
25 21 16 11 5 3

 

 

 

 

分享到:
评论

相关推荐

    通过分析_JDK_源代码研究_TreeMap_红黑树算法实现.docx

    ### 通过分析JDK源代码研究TreeMap红黑树算法实现 #### 一、TreeMap与TreeSet的关系 TreeMap 和 TreeSet 是 Java 集合框架中的重要成员,它们提供了基于红黑树的数据结构实现。从给定部分源代码可以看到,TreeSet ...

    第17章 - 深入研究容器 - Collection(List,Set,Queue)的性能测试框架(单线程中)(P501)

    在深入研究Java集合框架,特别是List、Set和Queue的性能测试时,我们通常会关注它们在单线程环境中的表现。这些容器是Java编程中不可或缺的一部分,用于存储和管理对象。本章将探讨如何构建一个性能测试框架来比较...

    java编程深入研究

    集合框架是Java库的核心部分,包括List、Set和Map接口以及它们的实现类,如ArrayList、LinkedList、HashSet、TreeSet、HashMap和TreeMap等。了解它们的特点和应用场景,以及泛型、迭代器和流API的使用,能够提高代码...

    对Java中Set的深入研究

    ### 对Java中Set的深入研究 #### 一、引言 在Java编程语言中,`Set`接口是一种非常重要的集合类型,它代表了一个无序且不允许包含重复元素的集合。`Set`接口属于Java集合框架的一部分,继承自`Collection`接口,并...

    基于二次误差度量的网格简化

    通过对这个项目的研究和理解,开发者可以学习到如何在实际编程中运用高级数据结构如TreeSet来解决复杂的算法问题,同时加深对网格简化算法及其二次误差度量的理解。这对于提升软件开发者的算法设计和实现能力,以及...

    Java中Set的深入研究

    在提供的代码片段中,可以看到`TreeSet`的实现细节,它实际上使用了一个`SortedMap`作为后盾存储结构,其中的值是一个静态内部类`PRESENT`的实例,仅用于占位,表示存在该键而无实际关联值。这种设计使得`TreeSet`...

    对Java中Set的深入研究.pdf

    Set接口继承自Collection接口,并提供了多种实现类,如HashSet、LinkedHashSet、TreeSet和CopyOnWriteArraySet等。这些实现类各自有不同的特性和使用场景。 1. 实现类详解: - `CopyOnWriteArraySet`:这个类基于`...

    java容器类研究与分析

    Java容器类,也称为集合类,是Java编程中用于存储和管理对象的重要工具。它们提供了比数组更加灵活和强大的功能,适用于各种复杂的数据结构需求。...对于初学者来说,深入研究容器类的原理和用法,将大大提升编程技能。

    slice-mapper-api-4.0.0-incubator.zip

    通过`UpdateableTreeSet-master`这个子目录,我们可以获取到源代码,深入研究其实现细节,学习如何在Java集合框架上进行扩展和定制,这对于提升我们的编程技能,理解和掌握数据结构及算法的应用具有很高的价值。...

    Java程序设计教学方法与考试模式研究.pdf

    例如,对于`TreeSet&lt;E&gt;`泛型类的学习,教师可以设置一系列问题,让学生逐步探索其构造方法和成员方法,增强教学的趣味性,促进学生自主掌握知识。 2. **对比教学法**: 教师可以通过比较不同的编程概念或技术,...

    中山大学研究生学院java讲义之(对象容器)

    此外,Java集合框架还提供了其他容器类,如TreeSet和TreeMap,它们基于红黑树实现,提供了有序的操作。Queue和Deque接口及其实现如ArrayDeque,用于处理队列和双端队列操作。PriorityQueue则用于创建优先级队列,...

    JAVA研究文集

    - List、Set、Map接口:ArrayList、LinkedList、HashSet、TreeSet、HashMap、LinkedHashMap等具体实现。 - 泛型:允许在集合中指定元素类型,提高了代码的类型安全。 - 集合操作:迭代、遍历、搜索、排序、集合...

    一种基于Java Web的敏感词过滤方法研究与实现.zip

    本文主要探讨了一种基于Java Web的敏感词过滤方法的研究与实现,旨在为网络平台提供安全、高效的内容过滤解决方案。 首先,我们要理解Java Web的基本概念。Java Web是Java技术在Web应用中的应用,它包括了Servlet、...

    基于数据结构与简化内存模型的Java集合教学方法研究.pdf

    数据结构是一门研究数据组织、存储、操作的学科。在教学中,教师需要先回顾数据结构课程的基础内容,如数据的组织和存储方式、线性结构与非线性结构的区别,以及线性表、顺序表和链表的概念和特点。线性结构可以...

    HashSetTreeSetHomeWork

    在本项目"HashSetTreeSetHomeWork"中,我们可能深入研究了这两种数据结构的特性和使用场景。 HashSet是基于HashMap实现的,它内部使用哈希表来存储元素,因此插入、删除和查找操作的平均时间复杂度为O(1)。但是,...

    Java集合类源码(摘自jr源码)

    深入研究这些源码,可以帮助开发者理解Java集合框架的内部工作机制,优化代码性能,以及解决并发和内存管理等高级问题。对于Java开发者来说,掌握这些集合类的实现细节是提升技术水平的关键步骤。

    东北大学计算机考研Java知识点笔记

    6. **集合框架**:包括List(ArrayList、LinkedList)、Set(HashSet、TreeSet)和Map(HashMap、TreeMap)。理解它们的特点、遍历方式和操作方法,如增删查改。 7. **泛型**:泛型用于提供类型安全,防止在运行时...

    对一致性Hash算法,Java代码实现的深入研究1

    Java中的`TreeMap`或`TreeSet`可以作为实现的工具。 每种方法都有其优缺点,排序+List虽然查找效率高,但排序过程可能较慢;遍历+List避免了排序,但查找效率略低;而红黑树在查找效率和动态调整方面表现优秀,但...

    分步迭代教学法在Java程序设计课程应用的研究与探索.zip

    在集合框架部分,教师可以先介绍ArrayList和LinkedList,然后过渡到HashMap和HashSet,最后讲解TreeMap和TreeSet等高级数据结构。每种数据结构的特点和使用场景都会通过实例来演示。 此外,输入输出流的学习也可以...

Global site tag (gtag.js) - Google Analytics