Java 中的多集数据结构
多重集是允许您存储相同值的多个元素的数据结构。 在 C++ 中,标准模板库 (STL) 包括一个多集实现,它提供了插入、删除和搜索元素的便捷操作。
这种数据结构在各种应用中都很有用,例如当您需要计算集合中元素的频率时。
但是 Java 是否有像 C++ STL 中那样的多集数据结构呢? 简短的回答是肯定的。
在 Java 中实现 Multiset 的选项
Java 提供了多种实现多重集的选项,包括:
- 使用映射:映射是将键映射到值的集合,实现多重集的一种选择是使用映射,其中键是元素,值是它们的频率。 要插入元素,您可以增加其频率,而要删除元素,您可以减少其频率。
- 使用列表或数组:另一种选择是使用列表或数组来存储元素,然后使用循环来计算每个元素的频率。 当集合大小很大时,这种方法可能会很慢,因为它需要线性时间来查找元素的频率。
- 使用第三方库:有几个第三方库可以为 Java 提供多集实现,例如 Google 的 Guava 库和 Apache Commons Collections。 这些库提供了类似于 C++ STL 多重集的便捷实现,如果您想避免编写实现,那么它们是一个不错的选择。
因此,Java 确实具有类似于 C++ STL 中的多集数据结构,但其实现并不是核心 Java 库的一部分。 相反,您必须使用 Map、List 或 Array 或第三方库来在 Java 中实现多重集。
Java 中多重集数据结构的示例
下面是 Java 中使用 Map<E, Integer>
的多集数据结构的简单示例:
import java.util.HashMap;
import java.util.Map;
public class MapMultiset<E> {
private Map<E, Integer> map;
public MapMultiset() {
map = new HashMap<>();
}
public void add(E element) {
Integer count = map.get(element);
if (count == null) {
count = 0;
}
map.put(element, count + 1);
}
public int count(E element) {
Integer count = map.get(element);
return count == null ? 0 : count;
}
public void remove(E element) {
Integer count = map.get(element);
if (count == null) {
return;
}
if (count == 1) {
map.remove(element);
} else {
map.put(element, count - 1);
}
}
public static void main(String[] args) {
MapMultiset<String> multiset = new MapMultiset<>();
multiset.add("apple");
multiset.add("banana");
multiset.add("apple");
multiset.add("orange");
System.out.println("Frequency of apple: " + multiset.count("apple"));
System.out.println("Frequency of banana: " + multiset.count("banana"));
System.out.println("Frequency of orange: " + multiset.count("orange"));
multiset.remove("apple");
System.out.println("Frequency of apple after removing one: " + multiset.count("apple"));
}
}
在此示例中,我们使用 Map<E, Integer>
来实现多重集 - 映射将元素存储为键,将它们的频率存储为值。
我们有add、count 和remove 方法,它们分别允许我们向多重集中添加元素、查找元素的频率以及删除元素的一次出现。
add 方法从映射中检索元素的当前计数,如果为 null,则将其设置为 0。然后该方法将计数加 1 并将更新后的计数存储在映射上。
count 方法从映射中检索元素的计数并返回它,如果该元素不在映射中则返回 0。
remove 方法从映射中检索元素的计数,如果为 null,则立即返回。 如果计数为 1,则该方法从映射中删除该元素。
如果计数大于 1,该方法会递减计数并将更新后的计数存储在映射中。
执行代码时,它会向多重集中添加几个元素,查找每个元素的频率,删除一次出现的“apple”元素,并打印每个元素的频率。
Java中Multiset的便捷实现
假设您正在寻找一种方便且高效的 Java 多重集实现。 使用 Guava 或 Apache Commons Collections 等第三方库是一个好主意。
这些库提供了一组丰富的功能,包括用于插入、删除和搜索元素的各种操作以及其他实用方法。
相关文章
Java 错误 Java.Security.InvalidKeyException: Illegal Key Size
发布时间:2023/07/15 浏览次数:98 分类:Java
-
本篇文章介绍包含 java.security.InvalidKeyException: Illegal key size 的 Java 代码。 然后,我们将了解其可能的原因。最后,它通过消除指定的错误来引导我们找到解决方案。
Java 错误 Java.SQL.SQLException: Access Denied for User Root@Localhost
发布时间:2023/07/15 浏览次数:71 分类:Java
-
本篇文章介绍如何解决 Java 中的 java.sql.SQLException: Access Denied for user 'root'@'localhost' 错误。修复 Java 中的 java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
Java 异常 Java.Lang.ClassNotFoundeException: Sun.Jdbc.Odbc.JdbcOdbcDriver
发布时间:2023/07/15 浏览次数:105 分类:Java
-
本篇文章介绍了 Java 中的 java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver 错误。修复 Java 中的 java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver
Java 错误 Gateway Process Exited Before Sending Its Port Number
发布时间:2023/07/15 浏览次数:104 分类:Java
-
本篇文章介绍了 Java 中 Java gateway process exited before sending the driver its port number 错误 Java gateway process exited before sending the driver its port number 错误
修复 Java 中 Java.Net.BindException: Address Already in Use: Bind 错误
发布时间:2023/07/15 浏览次数:76 分类:Java
-
本篇文章介绍了 Java 中的 java.net.BindException:Address already in use: Bind 错误。修复Java 中的 java.net.BindException:Address already in use: Bind
修复 Java 中 Java.Net.SocketException: Broken Pipe 错误
发布时间:2023/07/15 浏览次数:162 分类:Java
-
本篇文章介绍了使用 Java 编程的 java.net.SocketException: Broken pipeline 错误,并重点介绍了其可能的原因和解决方案。错误描述、原因及解决方法
Java 异常 Java.Lang.ClassNotFoundException: Org.SpringFramework.Web.Servlet.Dis
发布时间:2023/07/15 浏览次数:179 分类:Java
-
今天关于 Java 的文章将介绍错误 java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet。什么是 java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet
Java 抛出运行时异常 Throw Runtime Exception
发布时间:2023/07/15 浏览次数:146 分类:Java
-
本篇文章介绍如何在 Java 中引发运行时异常。Java 抛出运行时异常 Runtime Exception 是所有 Java 异常的父类,这些异常发生时会导致程序崩溃或崩溃。
Java 中抛出新异常 Throw New Exception
发布时间:2023/07/15 浏览次数:130 分类:Java
-
本文将展示如何使用 if ... else 条件语句生成错误。 我们还将使用示例和解释来讨论该主题,以使该主题更容易。在 Java 中生成一个简单错误