Multiset Interface in Java2025年3月28日 | 阅读7分钟 在Java中,基本的Set,如HashSet,属于Java的util包。通过它的使用,以及集合的数学属性,即其成员是不同的且不重复的。 但是,存在一些用例,例如频率表,这是一种需要集合进行重复目的的情况,其中允许重复。这时Multiset就派上用场了。 Java工具包不包含Multiset接口,但第三方库,其中之一是Google的Guava,包含了该接口。本文的目的是使用Java语言解释Multiset的概念、其相关性以及如何应用它。 什么是Multiset?Multiset(也称为bag)是一种数据容器,它允许同一个对象出现多次,并对项目进行计数。它的工作方式类似于List,允许项目重复,同时又能够容纳Set中的项目,但增加了一个计数功能。 在传统的Set中,每个成员最多只能出现一次,并且唯一可以执行的操作是确定成员是否存在。我们不仅可以知道特定元素是否属于Multiset,还可以知道该元素在此集合中出现了多少次。 使用Multiset的场景在需要跟踪元素频率的情况下,Multiset很有帮助,例如:
为什么要使用Multiset而不是List或Map?List:允许重复,但它不提供直接的方法来识别每个元素重复的次数。 Map:通过使用Map<E, Integer>,可以以类似的方式实现计数元素数量的功能,但您无法实现Multiset所提供的特定行为,例如直接将元素与计数一起添加。 Multiset:它提供了允许重复元素的选项,同时计数器在后台跟踪计数,并设计了一个清晰的API来执行添加、删除或查询元素频率等操作。 Guava中的MultisetGoogle的Guava库提供了Multiset接口,该接口非常高效且应用广泛。它支持多种实现,例如: HashMultiset:使用HashMap在Java中实现;对于字段S,它可以包含重复值,并且在时间复杂度方面,大多数操作需要O(1)。 TreeMultiset:它还可以像TreeMap一样维护元素的顺序,同时所有操作都在对数时间内执行。 与Guava中的每个项目一样——特别是要使用Multiset——请确保您已将库添加到您的项目中。 示例让我们通过一个例子来理解Multiset的概念。 文件名:MultisetExample.java 输出 Count of apples: 2 Total elements (with duplicates): 4 Count of apples after removal: 1 banana occurs 1 time orange occurs 1 time apple occurs 1 time Guava的Multiset可用的主要操作包括以下几项: Multiset操作add(E element):此方法将特定元素插入到multiset中。如果元素已存在,则我们只需将该元素的计数加一。 这使得处理允许重复值的集合变得容易,并且它还更新内部存储的每个元素的出现次数。当需要更频繁地添加项目以及处理数据重复时,它最有价值。 add(E element, int occurrences):此方法将指定的元素插入此multiset指定的次数。它是一种批量添加方法,不需要在循环中调用add(),这样效率低下。 如果元素已存在,则计数将按此处提到的出现次数递增。在系统中存在相同元素持续传输的大型应用程序受益于此。 count(Object element):此方法仅提供一个数字,该数字表示特定元素在multiset中的当前出现次数。如果给定的元素不存在,则该方法返回零。 在用户对列表中某个特定项目出现的次数感兴趣的情况下,它很有益,常见用法包括:
remove(Object element):此方法删除给定元素的一个副本,并从现有multiset创建一个新的multiset。当元素有多个出现时,只删除一个副本,因此计数减少一。 如果它只出现一次,则该元素将完全从集合中删除。这种方法在处理动态集合时很有帮助,即那些可以被调用并添加或删除元素的集合。 remove(Object element, int occurrences):此方法帮助从列表中删除指定次数的元素实例。如果元素的计数低于指定的出现次数,则计数将变为零,从而消除该元素。 当需要多次删除元素以避免混淆时,它很有帮助,例如在修改库存或重新评估数据集时使用。 size():此方法返回multiset中的元素总数,忽略它们的数量。与普通Set相比,实现的size不表示不同元素的数量,而是元素的总数。 例如,其size将根据元素出现的次数进行调整,其中在此情况下出现5次。当寻求对multiset中存在的所有数据获得更广泛的洞察时,它非常有用。 elementSet():此方法生成此multiset中存在的所有元素的集合视图。请注意,multiset可能包含元素的重复项,而elementSet()方法返回一个类似集合的结构,其中任何元素都不能出现一次以上。 当枚举唯一元素时,它会派上用场;但是,可以使用count()方法单独获得频率。 Multiset与Map:基本区别虽然您可以使用Map<E, Integer>来模拟multiset,但存在显著差异: API简洁性:multiset提供了更自然、更方便的接口,其中包含添加元素、删除元素和访问计数的各种方法。Map<E, Integer>具有更高的复杂性,需要更多的样板代码。 处理计数:multiset会为您妥善处理计数方面的问题。此外,当添加或删除元素时,它会在没有额外代码指令的情况下更改计数。 类似Set的操作:您可以称之为与multiset中的特定项的交互(例如,迭代Set中的唯一元素)类似于与Set的交互,这对于Map来说并不完全自然。 注意事项和边缘情况负计数:如前所述,multiset不存在负计数的规定。如果您尝试删除不存在的情况,则计数将降至零。 Null元素:Null元素是否受multiset支持取决于实现,例如Hashmultiset。 性能:multiset的通用性能基于multiset的实现。例如,HashMultiset提供常数时间操作,TreeMultiset提供对数时间操作但元素有序。 结论如果您处理允许重复元素且必须存储频率的集合,Multiset会很有帮助。Java最初不包含Multiset接口;但是,我们可以通过使用Guava库(例如HashMultiset或TreeMultiset)轻松实现该接口。 Multiset是一个经过轻微修改的List,其中允许重复和计数要求,并且计数是机械地处理的。许多编程操作因它而变得容易,包括计算语言中单词的频率、维护库存、计算分析中的出现次数等。 下一主题Java中的构造函数重载 |
Java 是一种计算平台,是一种面向对象的、面向类的、高级编程语言,由 Sun Microsystems 于 1995 年首次发布。从最初的卑微起点,它已经发展到通过提供一个可靠的平台来驱动当今数字世界的很大一部分,该平台可以实现许多...
阅读 3 分钟
JonDonym(也称为 JAP)是一种代理系统,旨在实现可撤销的匿名性(使用或以笔名、假名或虚构名称出版的状态)。没有这种匿名性,使用互联网的每个设备...
阅读 4 分钟
在本节中,我们将学习什么是Sylvester序列,并创建Java程序来计算Sylvester序列。Sylvester序列程序经常在Java编码面试和学术界中出现。Sylvester序列:Sylvester序列是一个数字序列,其中每个项都是...
阅读 3 分钟
在本节中,我们将学习什么是神秘数字,并创建 Java 程序来检查给定数字是否为神秘数字。神秘数字程序经常在 Java 编码测试和学术界中出现。神秘数字 如果一个数字 N 被称为...
阅读 3 分钟
在本节中,我们将学习什么是贝尔数,并创建 Java 程序来检查给定的数字是否为贝尔数。贝尔数程序经常在 Java 编码面试和学术界中出现。贝尔数 贝尔数是一系列...
阅读 4 分钟
在线编译器是一个基于云的 IDE,可帮助开发人员在线编译和执行 Java 程序,而无需在本地系统上安装 JDK。在本节中,我们将讨论一些流行的在线 Java 编译器,它们都是免费提供的。流行的在线...
阅读 6 分钟
在Java编程的世界里,数据结构在高效地存储和操作数据方面起着至关重要的作用。用于此目的的两种常用数据结构是向量和数组。虽然两者都用于存储元素集合,但它们具有明显的区别,这使得它们...
阅读 13 分钟
Java 中的 LocalDate 类提供了一种机制,可以与日期交互,而无需时间或时区组件作为 Java 8 Date and Time API 的一部分。这个不可变的类代表一个日期(年、月、日),但不代表其时间。经常需要……
阅读 4 分钟
Kruskal算法是用于最小生成树的另一个最重要算法。MST是权重小于或等于每棵生成树权重的生成树。Java中的Kruskal算法接受一个连通的无向图并返回最小生成树...
阅读 3 分钟
?任何 Java 对象的 toString() 函数都返回该对象的字符串表示。默认情况下,此函数会生成一个包含对象类名、"@" 符号以及其十六进制哈希码的字符串。但是,在某些情况下,您可能希望... ...
阅读 3 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India