资讯专栏INFORMATION COLUMN

Java™ 教程(SortedSet接口)

amc / 748人阅读

SortedSet接口

SortedSet是一个Set,它按升序维护其元素,根据元素的自然顺序或根据SortedSet创建时提供的Comparator进行排序,除了常规的Set操作外,SortedSet接口还提供以下操作:

范围视图 — 允许对已排序集进行任意范围操作。

端点 — 返回有序集合中的第一个或最后一个元素。

比较器访问 — 返回用于对集合进行排序的Comparator(如果有)。

下面是SortedSet接口的代码。

public interface SortedSet extends Set {
    // Range-view
    SortedSet subSet(E fromElement, E toElement);
    SortedSet headSet(E toElement);
    SortedSet tailSet(E fromElement);

    // Endpoints
    E first();
    E last();

    // Comparator access
    Comparator comparator();
}
Set操作

SortedSetSet继承的操作在有序集和普通集上的行为相同,但有两个例外:

Iterator操作返回的iterator按顺序遍历有序集。

toArray返回的数组按顺序包含有序集的元素。

虽然接口不保证它,但Java平台的SortedSet实现的toString方法按顺序返回包含有序集的所有元素的字符串。

标准构造函数

按照惯例,所有通用Collection实现都提供了一个带有Collection的标准转换构造函数,SortedSet实现也不例外,在TreeSet中,此构造函数创建一个实例,根据其自然顺序对其元素进行排序,这可能是一个错误,最好动态检查以查看指定的集合是否是SortedSet实例,如果是,则根据相同的标准(比较器或自然排序)对新TreeSet进行排序。因为TreeSet采用了它所采用的方法,所以它还提供了一个构造函数,它接受一个SortedSet并返回一个新的TreeSet,它包含根据相同标准排序的相同元素。请注意,它是参数的编译时类型,而不是其运行时类型,它确定调用这两个构造函数中的哪一个(以及是否保留了排序条件)。

按照惯例,SortedSet实现还提供了一个构造函数,它接受一个Comparator并返回一个根据指定的Comparator排序的空集,如果将null传递给此构造函数,则返回一个集合,该集合根据其自然顺序对其元素进行排序。

范围视图操作

范围视图操作有点类似于List接口提供的操作,但有一个很大的区别,即使直接修改了后备排序集,排序集的范围视图仍然有效,这是可行的,因为有序集的范围视图的端点是元素空间中的绝对点,而不是后备集合中的特定元素,如列表的情况。排序集的范围视图实际上只是集合的任何部分位于元素空间的指定部分中的窗口,对范围视图的更改将写回到后备排序集,反之亦然,因此,与列表上的范围视图不同,可以在很长一段时间内对已排序的集使用范围视图。

排序集提供三种范围视图操作,第一个subSet采用两个端点,如subList,而不是索引,端点是对象,必须与有序集合中的元素相比较,使用SetComparator或其元素的自然顺序,无论Set使用哪个自定义,与subList一样,范围是半开放的,包括其低端点但不包括高端点。

因此,下面的代码行告诉你,包含在名为dictionary的字符串SortedSet中,“doorbell”和“pickle”之间有多少单词,包括“doorbell”,但不包括“pickle”:

int count = dictionary.subSet("doorbell", "pickle").size();

以类似的方式,以下单行删除以字母f开头的所有元素。

dictionary.subSet("f", "g").clear();

类似的技巧可以用来打印一个表格,告诉你每个字母开头有多少个单词。

for (char ch = "a"; ch <= "z"; ) {
    String from = String.valueOf(ch++);
    String to = String.valueOf(ch);
    System.out.println(from + ": " + dictionary.subSet(from, to).size());
}

假设你要查看包含其两个端点的封闭间隔,而不是开放的间隔,如果元素类型允许计算元素空间中给定值的后继,则仅从subSetlowEndpoint请求到successor(highEndpoint),虽然它并不完全明显,但String的自然排序中的字符串s的后继是s + "" — 也就是说,附加了空字符的s

因此,下面的单行告诉你“doorbell”和“pickle”之间有多少单词,包括doorbellpickle,都包含在字典中。

count = dictionary.subSet("doorbell", "pickle").size();

可以使用类似的技术来查看不包含端点的开放间隔,从lowEndpointhighEndpoint的开放间隔视图是从successor(lowEndpoint)highEndpoint的半开放间隔,使用以下内容计算“doorbell”和“pickle”之间的单词数,不包括两者。

count = dictionary.subSet("doorbell", "pickle").size();

SortedSet接口包含另外两个范围视图操作 — headSettailSet,两者都采用单个Object参数,前者返回后备SortedSet的初始部分的视图,直到但不包括指定的对象,后者返回后备SortedSet的最后一部分的视图,从指定的对象开始,一直到后备SortedSet的末尾,因此,以下代码允许你将字典视为两个不相交的卷(a-mn-z)。

SortedSet volume1 = dictionary.headSet("n");
SortedSet volume2 = dictionary.tailSet("n");
端点操作

SortedSet接口包含返回有序集合中第一个和最后一个元素的操作,毫不奇怪被称为firstlast,除了它们的明显用途之外,last还允许解决SortedSet接口中的不足。你想对SortedSet做的一件事就是进入Set的内部并向前或向后迭代,从内部向前迭代很容易:只需获取一个tailSet并迭代它,不幸的是,没有简单的方法可以倒退。

以下语法获得的元素空间中小于指定对象o的第一个元素。

Object predecessor = ss.headSet(o).last();

这是从排序集内部的一个点向后移动一个元素的好方法,它可以重复应用以向后迭代,但这是非常低效的,需要查找返回的每个元素。

Comparator访问

SortedSet接口包含一个名为comparator的访问器方法,它返回用于对集合进行排序的Comparator,如果集合根据其元素的自然顺序排序,则为null,提供此方法以便可以将排序的集合复制到具有相同排序的新排序集合中,它由前面描述的SortedSet构造函数使用。

上一篇:对象排序

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74006.html

相关文章

  • Java教程(集合接口

    集合接口 核心集合接口封装了不同类型的集合,如下图所示,这些接口允许独立于其表示的细节来操纵集合,核心集合接口是Java集合框架的基础,如下图所示,核心集合接口形成层次结构。 showImg(https://segmentfault.com/img/bVbntJW?w=402&h=146); Set是一种特殊的Collection,SortedSet是一种特殊的Set,依此类推,另请注意,层次结构...

    elisa.yang 评论0 收藏0
  • Java教程(SortedMap接口

    SortedMap接口 SortedMap是一个按升序维护其条目的Map,根据键的自然顺序或在创建SortedMap时提供的Comparator进行排序,SortedMap接口提供常规Map操作和以下操作的操作: 范围视图 — 对排序后的map执行任意范围操作 端点 — 返回已排序map中的第一个或最后一个键 比较器访问 — 返回用于排序map的Comparator(如果有的话) 下面的接口是...

    JessYanCoding 评论0 收藏0
  • Java教程(目录)

    Java™ 教程 Java教程是为JDK 8编写的,本页面中描述的示例和实践没有利用在后续版本中引入的改进。 Java教程是希望使用Java编程语言创建应用程序的程序员的实用指南,其中包括数百个完整的工作示例和数十个课程,相关课程组被组织成教程。 覆盖基础知识的路径 这些教程以书籍的形式提供,如Java教程,第六版,前往Amazon.com购买。 入门 介绍Java技术和安装Java开发软件并使用...

    lifesimple 评论0 收藏0
  • java集合类

    摘要:集合类简介集合类包含在包下集合类存放的是对象的引用,而非对象本身。集合类型主要分为集,列表,映射。返回此有序集合中当前第一个最小的元素。集合中元素被访问的顺序取决于集合的类型。 Java集合类 1.简介: java集合类包含在java.util包下集合类存放的是对象的引用,而非对象本身。集合类型主要分为Set(集),List(列表),Map(映射)。 1.1 java集合类图 sho...

    Pluser 评论0 收藏0
  • Java 集合 Set

    摘要:当复制集合中的所有元素来创建新的集合时,要求集合中的所有元素必须是同一个枚举类的枚举值各实现类的性能分析的性能总比好,特别是最常用的添加查询元素等操作。因为需要额外的红黑树算法来维护集合元素的次序。在创建时进行,以防对集合的意外非同步访问 HashSet 大多时候使用Set集合时就是使用HashSet实现类。HashSet按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能 ...

    verano 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<