TreeSet与HashSet类似,不过TreeSet是一个有序集合(sorted collection),在对集合进行遍历时,每个值将自动的按照TreeSet内部排序的顺序呈现。当前TreeSet实现使用的是红黑树(red-black tree,详细介绍可以参照《算法导论》一书),每次将一个元素添加到树中时,都被放置在正确的排序位置上,因此,迭代器总是以排好序的顺序访问每个元素。
将一个元素添加到树中比添加到散列表中慢,但是比添加到数组或者链表中正确位置上要快很多。例如如果树中包含n个元素,查找新元素的正确位置平均需要log2n次比较,也就是如果树中包含1000个元素,添加一个新元素大约需要比较10次即可。
对象的比较
TreeSet如何知道元素怎么排列呢?树集假定插入的元素实现了Comparable接口,这个接口有一个定义的方法:
public interface Comparable<T> { int compareTo(T other); }
有些标准的Java平台类实现类Comparable接口,例如String类,这个类的compareTo方法依据字典序(有时称为词典序)对字符串进行比较。如果要插入自定义的对象,就必须通过实现Comparable接口自定义排列顺序。在Object类中,没有提供compareTo接口的默认实现。
例如下面的代码展示了如何用部件编号对Item对象进行排序:
class Item implements Compareble<Item> { public int compareTo(Item other) { return partNumber - other.partNumber; //需要确保结果不会溢出 } ...... }
对于一个给定的类,只能实现这个接口一次,如果在一个集合中需要按照部件编号进行排序,在另一个集合中却要按照描述信息进行排序,该怎么办呢?另外,如果需要对一个类的对象进行排序,而这个类的创建者有没有实现Comparable接口,又该怎么办呢?以上两种情况下,可以通过将Comparator对象传递给TreeSet构造器来告诉树集使用不同的比较方法,Comparator接口声明了一个带有两个显式参数的compare方法。
public interface Comparator<T> { int compare(T a,T b); }
如果按照描述信息进行排序,就直接定义一个实现Comparator接口的类:
class ItemComparator implements Comparator<Item> { public int compare(Item a, Item b) { String descrA = a.getDescription(); String descrB = b.getDescription(); return descrA.compareTo(descrB); } }
然后将这个类的对象传递给树集的构造器:
ItemComparator comp = new ItemComparator(); SortedSet<Item> sortByDescription = new TreeSet<Item>(comp);
如果构造了一棵带有比较器的树,就可以在需要比较两个元素时使用这个对象。
注意,这个比较器没有任何数据,它只是比较方法的持有器。有时将这种对象称为函数对象(function object)。函数对象通常被定义为“瞬时的”,即匿名内部类的实例:
SortedSet<Item> sortByDescription = new TreeSet<Item>(new Comparator<Item>() { public int compare(Item a, Item b) { String descrA = a.getDescription(); String descrB = b.getDescription(); return descrA.compareTo(descrB); } });
注:从Java SE6开始,TreeSet类实现了NavigableSet接口,这个接口增加了几个便于定位元素以及反向遍历的方法,具体可参见API注释。
下面例子中创建了两个Item对象的树集,第一个按照编号排序,是对象的默认顺序,第二个通过使用一个定制的比较器来按照描述信息排序。代码如下:
package com.chensl.collection; import java.util.*; /** This program sorts a set of item by comparing their descriptions. */ public class TreeSetTest { public static void main(String[] args) { SortedSet<Item> parts = new TreeSet<Item>(); parts.add(new Item("Toaster", 1234)); parts.add(new Item("Widget", 4562)); parts.add(new Item("Modem", 9912)); System.out.println(parts); SortedSet<Item> sortByDescription = new TreeSet<Item>(new Comparator<Item>() { public int compare(Item a, Item b) { String descrA = a.getDescription(); String descrB = b.getDescription(); return descrA.compareTo(descrB); } }); sortByDescription.addAll(parts); System.out.println(sortByDescription); } } /** An item with a description and a part number. */ class Item implements Comparable<Item> { /** Constructs an item. @param aDescription the item's description @param aPartNumber the item's part number */ public Item(String aDescription, int aPartNumber) { description = aDescription; partNumber = aPartNumber; } /** Gets the description of this item. @return the description */ public String getDescription() { return description; } public String toString() { return "[descripion=" + description + ", partNumber=" + partNumber + "]"; } 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 description.equals(other.description) && partNumber == other.partNumber; } public int hashCode() { return 13 * description.hashCode() + 17 * partNumber; } public int compareTo(Item other) { return partNumber - other.partNumber; } private String description; private int partNumber; }
发表评论
-
Java添加UTF-7字符集支持(转)
2014-08-16 16:20 867这段时间在做PushServer时,需要对编码过的邮件标题及 ... -
问题记录
2012-05-02 20:58 451. 如何使java打印byte类型数据? 如: / ... -
利用java反射机制实现IoC容器
2011-07-05 17:44 0P717 -- P719 -
网址资源保存
2011-05-18 18:20 90xwork 下载地址: http://release.ope ... -
JAVA工具类(暂保存草稿,如果发表的话需要分别修改验证工具类内容)
2010-09-15 00:02 0(暂保存草稿,如果发表的话需要分别修改验证工具类内容) ... -
Collection之映射表(Maps)
2010-09-07 11:08 1367映射表(map)用来存放键/值对,如果提供了键,就能够找到值, ... -
Collection之双端队列与优先级队列(Priority queue)
2010-09-06 10:28 1990双端队列 在Java SE6中,引入了Deque接口,并由A ... -
Collection之散列表(hash table)
2010-09-04 22:10 904链表和数组中元素是按一定次序进行排列的,散列表不在意元素的顺序 ... -
Collection之数组列表
2010-09-02 17:52 883数组列表(ArrayList)和上文中介绍的链表(Li ... -
Collection之链表
2010-09-02 11:00 905在Java语言中,所有的链表都是双向链接的(doubly li ... -
Concrete Collection集合概要
2010-09-02 00:22 778Java类库中的具体的集合: ArrayList 一种可以 ... -
泛型代码与虚拟机
2010-08-31 22:27 858虚拟机没有泛型对象,所有对象都属于普通类,使用当前Sun的编译 ... -
JAVA集合接口
2010-08-31 16:49 1278集合接口,JAVA集合类库 ... -
JAVA静态成员和静态内部类
2010-08-29 10:45 2192静态类(static class)即定义了静态方法,静 ... -
Java数据结构和算法--树(转)
2010-08-25 18:16 751(1)二叉树 class Tree { cl ...
相关推荐
HashSet 是一种哈希集,元素的顺序是随机的,LinkedHashSet 是一种链表集,元素的顺序是按照添加顺序的,TreeSet 是一种树形集,元素的顺序是按照比较器的顺序的。 Map 是一种键值对的集合,提供了许多有用的方法来...
- **类集(Collection)**:一种数据结构,用于存储一组对象。 - **集合框架**:Java集合框架是一种标准化的数据结构处理方式,它提供了一套统一的API来操作各种不同的集合类型。 #### 四、Java 集合框架的特点 - ...
总的来说,Java中的`Collection`框架是编程的核心工具之一,理解其工作原理和使用技巧,能够帮助开发者编写出更加高效、可靠的代码。通过深入学习和实践,你可以更好地驾驭这个强大的工具集,提升你的编程能力。
TreeSet 内部实现为红黑树,它维护了元素的排序顺序(默认是自然排序或自定义比较器)。因此,TreeSet 的插入和查找操作时间复杂度为 O(logn)。 **Map 接口** Map 接口用于存储键值对,其中键是唯一的。常见的 Map ...
- **描述**:`TreeSet` 是一种基于红黑树实现的 `Set`,它能够保证元素的唯一性和排序。 #### 5. **HashMap** - **描述**:`HashMap` 是一种基于哈希表实现的 `Map`,它可以高效地存储和检索键值对。 #### 6. **...
Java集合框架是一个包含多种数据结构(如列表、集、队列等)的API,这些数据结构由接口(如`Collection`、`List`、`Set`和`Queue`)和实现这些接口的类(如`ArrayList`、`HashSet`和`LinkedList`)组成。`Collection...
类集是各种数据结构的集合,如数组、链表、树等,它们提供了高效的操作和灵活性,使得程序员能够根据需要选择最适合的数据结构来存储和操作数据。本章主要讨论Java类集的基本概念、接口框架以及常用的实现类,如...
2. **HashSet**、**LinkedHashSet** 和 **TreeSet**: 实现了Set接口,分别基于哈希表、链接列表和红黑树,提供不同级别的元素排序和查找性能。 3. **HashMap**、**LinkedHashMap** 和 **TreeMap**: 实现了Map接口,...
TreeSet使用红黑树实现,保持元素排序。 理解并熟练使用Java集合框架对于任何Java开发者来说都至关重要。这不仅涉及到了数据的存储,还包括了算法和数据结构的知识,这些在解决实际问题时经常被运用到。例如,...
- **TreeSet**:基于红黑树数据结构,元素有序(根据自然排序或自定义比较器),插入速度相对较慢。 **Map 接口** Map 接口不同于 Collection,它存储键值对(key-value)。Map 的两个主要子接口是 HashMap 和 ...
这些接口由Java Collection Framework提供,它是一个统一的架构,用于存储和操作各种类型的对象。接下来,我们将深入探讨这三个核心接口以及它们的相关知识点。 1. **List接口**: List是一种有序的集合,允许元素...
- **TreeMap/TreeSet**: 基于红黑树数据结构,保持元素的排序顺序。 3. **泛型**:类集框架广泛使用泛型,允许我们在声明集合时指定元素类型,增强了类型安全并减少了强制类型转换。 4. **迭代器**:用于遍历集合...
TreeSet基于红黑树,元素按特定顺序排列,适合需要排序的场景。 Map接口不同于Collection,它存储的是键值对。常见的Map实现类有Hashtable、HashMap和WeakHashMap。Hashtable与Vector类似,是线程安全的,但不推荐...
- `TreeSet`:实现了`SortedSet`接口,内部使用红黑树结构,元素有序,插入和查找速度较慢于`HashSet`,但支持自然排序或自定义比较器排序。 3. **Map接口**: - `Hashtable`:古老且线程安全的映射实现,键和值...
在Set接口中,常见的实现类有HashSet和TreeSet,它们分别基于哈希表和红黑树实现。在List接口中,ArrayList和LinkedList是最常用的实现,前者基于动态数组,后者基于链表。 理解并熟练运用类集框架对于任何Java...
Java集合框架是编程中不可或缺的一部分,它提供了多种数据结构,如列表(List)、集(Set)以及映射(Map),便于我们高效地存储、管理和操作数据。本文将深入探讨Map和Collection接口,以及它们的实现类,特别是HashSet和...
`HashMap`提供了高效的查找,`LinkedHashMap`保持了插入顺序或访问顺序,`TreeMap`则是基于红黑树实现,保证了键的排序性。 在I/O部分,笔记可能涵盖`InputStream`和`OutputStream`流的使用,它们分别是字节输入和...
8. **集合(Set)**:集合不允许有重复元素,`HashSet`和`TreeSet`分别基于哈希表和红黑树实现,提供不同的性能特性。 9. **映射(Map)**:映射存储键值对,`HashMap`和`TreeMap`提供了高效的查找、插入和删除操作...
### Java常用类集知识点 #### 一、Java 集合框架概述 Java集合框架是Java平台的一个核心组件,提供了存储和操作数据的各种接口和实现类。这些接口和类可以帮助开发者更加高效地处理数据集合。Java集合框架主要包括...
4. TreeSet:基于红黑树实现的Set,元素有序,查找速度快,但插入和删除效率相对较低。 5. HashMap:基于哈希表实现的Map,键值对的存取速度较快,但无序。 6. TreeMap:基于红黑树实现的Map,键值对有序,查找、...