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红黑树算法实现 #### 一、TreeMap与TreeSet的关系 TreeMap 和 TreeSet 是 Java 集合框架中的重要成员,它们提供了基于红黑树的数据结构实现。从给定部分源代码可以看到,TreeSet ...
在深入研究Java集合框架,特别是List、Set和Queue的性能测试时,我们通常会关注它们在单线程环境中的表现。这些容器是Java编程中不可或缺的一部分,用于存储和管理对象。本章将探讨如何构建一个性能测试框架来比较...
集合框架是Java库的核心部分,包括List、Set和Map接口以及它们的实现类,如ArrayList、LinkedList、HashSet、TreeSet、HashMap和TreeMap等。了解它们的特点和应用场景,以及泛型、迭代器和流API的使用,能够提高代码...
### 对Java中Set的深入研究 #### 一、引言 在Java编程语言中,`Set`接口是一种非常重要的集合类型,它代表了一个无序且不允许包含重复元素的集合。`Set`接口属于Java集合框架的一部分,继承自`Collection`接口,并...
通过对这个项目的研究和理解,开发者可以学习到如何在实际编程中运用高级数据结构如TreeSet来解决复杂的算法问题,同时加深对网格简化算法及其二次误差度量的理解。这对于提升软件开发者的算法设计和实现能力,以及...
在提供的代码片段中,可以看到`TreeSet`的实现细节,它实际上使用了一个`SortedMap`作为后盾存储结构,其中的值是一个静态内部类`PRESENT`的实例,仅用于占位,表示存在该键而无实际关联值。这种设计使得`TreeSet`...
Set接口继承自Collection接口,并提供了多种实现类,如HashSet、LinkedHashSet、TreeSet和CopyOnWriteArraySet等。这些实现类各自有不同的特性和使用场景。 1. 实现类详解: - `CopyOnWriteArraySet`:这个类基于`...
Java容器类,也称为集合类,是Java编程中用于存储和管理对象的重要工具。它们提供了比数组更加灵活和强大的功能,适用于各种复杂的数据结构需求。...对于初学者来说,深入研究容器类的原理和用法,将大大提升编程技能。
通过`UpdateableTreeSet-master`这个子目录,我们可以获取到源代码,深入研究其实现细节,学习如何在Java集合框架上进行扩展和定制,这对于提升我们的编程技能,理解和掌握数据结构及算法的应用具有很高的价值。...
例如,对于`TreeSet<E>`泛型类的学习,教师可以设置一系列问题,让学生逐步探索其构造方法和成员方法,增强教学的趣味性,促进学生自主掌握知识。 2. **对比教学法**: 教师可以通过比较不同的编程概念或技术,...
此外,Java集合框架还提供了其他容器类,如TreeSet和TreeMap,它们基于红黑树实现,提供了有序的操作。Queue和Deque接口及其实现如ArrayDeque,用于处理队列和双端队列操作。PriorityQueue则用于创建优先级队列,...
- List、Set、Map接口:ArrayList、LinkedList、HashSet、TreeSet、HashMap、LinkedHashMap等具体实现。 - 泛型:允许在集合中指定元素类型,提高了代码的类型安全。 - 集合操作:迭代、遍历、搜索、排序、集合...
本文主要探讨了一种基于Java Web的敏感词过滤方法的研究与实现,旨在为网络平台提供安全、高效的内容过滤解决方案。 首先,我们要理解Java Web的基本概念。Java Web是Java技术在Web应用中的应用,它包括了Servlet、...
数据结构是一门研究数据组织、存储、操作的学科。在教学中,教师需要先回顾数据结构课程的基础内容,如数据的组织和存储方式、线性结构与非线性结构的区别,以及线性表、顺序表和链表的概念和特点。线性结构可以...
在本项目"HashSetTreeSetHomeWork"中,我们可能深入研究了这两种数据结构的特性和使用场景。 HashSet是基于HashMap实现的,它内部使用哈希表来存储元素,因此插入、删除和查找操作的平均时间复杂度为O(1)。但是,...
深入研究这些源码,可以帮助开发者理解Java集合框架的内部工作机制,优化代码性能,以及解决并发和内存管理等高级问题。对于Java开发者来说,掌握这些集合类的实现细节是提升技术水平的关键步骤。
6. **集合框架**:包括List(ArrayList、LinkedList)、Set(HashSet、TreeSet)和Map(HashMap、TreeMap)。理解它们的特点、遍历方式和操作方法,如增删查改。 7. **泛型**:泛型用于提供类型安全,防止在运行时...
Java中的`TreeMap`或`TreeSet`可以作为实现的工具。 每种方法都有其优缺点,排序+List虽然查找效率高,但排序过程可能较慢;遍历+List避免了排序,但查找效率略低;而红黑树在查找效率和动态调整方面表现优秀,但...
在集合框架部分,教师可以先介绍ArrayList和LinkedList,然后过渡到HashMap和HashSet,最后讲解TreeMap和TreeSet等高级数据结构。每种数据结构的特点和使用场景都会通过实例来演示。 此外,输入输出流的学习也可以...