本文讨论了Java中的HashMap ,以及如何为Java中的HashMap中的单键添加多个值。
哈希图
Java中的HashMap是一种工具,通过以键和值对的形式存储数据,允许使用索引概念进行有效的访问、插入、删除和更新。
它是在Java 1.2版本中引入的,因此一直是Java集合库的一部分。
它被包含在java.util package 。Java 5将HashMaps 表示为HashMap ,其中K 代表键,V 代表值。
HashMap能否自动存储多个值
HashMap 与 有相似之处,除了它是异步的。它意味着 可以存储空键,而 不能。HashTable HashMap HashTable
HashMap HashMap允许存储任意数量的空值,但在整个Map中必须只有一个空键。
HashMap 的另一个重要属性是,如果它遇到一个已经存在的键的不同值,它将覆盖同一键的值。
这有时是编程用例所不希望看到的。因此,在这篇文章中,我们将讨论在Java的HashMap 中为同一个键存储多个值的变通方法。
在Java中为HashMap的单个键添加多个值的方法
使用标准库
如果你需要在同一个键下添加不同的值,其中一个方法是使用一个Java集合类,如ArrayList、List 等。
在Java中有许多这样的集合类,你可以将其嵌入到HashMap ,这将使整个集合在HashMap 中的同一个键下。
下面的示例代码使用了java.util 库中的ArrayList 。它被用来存储不同的值,这些值后来成为HashMap 的一部分。
让我们看一下下面的Java代码,以便更好地了解它是如何工作的。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class Sample {
public static void main(String[] args)
{
Map
输出:
4=[1+3, 2+2, 3+1] 5=[1+4, 2+3, 3+2, 4+1]
在上面的代码中,组成一个数字的不同组合被放在HashMap 的同一个键下。
HashMap 使用了Integer类,而ArrayList 使用了Strings类。Strings是不同的组合,例如,字符串 "1+3 "的结果是4,这是该字符串的键值。
使用Apache Commons库
Apache Commons库扩展了Java API,它是一个完整的软件包,包含了一系列非常有用的实用类。
,你需要添加以下依赖关系以获得Apache commons jar。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
它对许多有序的数据结构和基本数据结构的操作都有实现。
你可以使用Apache Commons集合库中的MultiMap 和MultiValueMap ,在同一个键中存储多个值。
下面的代码说明了这一点。
import java.util.Set;
import org.apache.commons.collections4.MultiMap;
import org.apache.commons.collections4.map.MultiValueMap;
public class Sample {
public static void main(String[] args)
{
MultiMap
输出。
4=[1+3, 2+2, 3+1] 5=[1+4, 2+3, 3+2, 4+1]
上面的代码实现了同样的数字组合存储的例子,是将组合的输出作为键存储在哈希图中。
不过,这个实现使用的是Apache Commons库,你可以将其作为外部jar文件或maven项目的pom文件中的依赖项加入。
使用Google Guava库
Google guava是另一个由google建立的类似库,它主要是为google内部的java项目开发的,但它被托管为一个开源库。
你可以在任何maven项目中使用Google Guava库,与Apache Commons库类似。
这里是你需要在pom.xml 中为guava添加的依赖。
com.google.guava
guava
29.0-jre
本例使用了google guava库的ArrayListMultiMap 。
与Apache Commons库类似,你可以在maven项目的pom文件中把这个库作为依赖项添加,或者作为外部jar文件库。
import java.util.Set;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
public class Sample {
public static void main(String[] args)
{
ArrayListMultimap
输出 :
4=[1+3, 2+2, 3+1] 5=[1+4, 2+3, 3+2, 4+1]
这段代码从google guava中导入了ArrayListMultimap,并用于制作多图,该多图再次将组合存储在哈希图的同一输出键中。
使用TreeSet作为值
TreeSet 是一个非常有用的数据集,因为它实现了从排序集派生出来的可浏览集,而排序集又是从java库的集合类派生出来的。
当需要存储大量的数据但又需要快速访问时,它就很方便。
请注意,你不能在TreeSet 中插入空值,因为它不能与TreeSet 中已有的任何其他数据进行比较。
我们将继续上面的例子,在哈希图的同一键中实现数字组合的存储。
下面的示例代码解释了如何在Java中将TreeSet 嵌入到HashMap 。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
public class Sample {
public static void main(String[] args) {
HashMap
输出:
4=[1+3, 2+2, 3+1] 5=[1+4, 2+3, 3+2, 4+1]
正如你所观察到的,上述代码在实施时将TreeSet 嵌入到HashMap ,以排序的顺序打印输出。
对HashMap 值的访问可能会更快,但正如你所看到的,它可能需要额外使用内存,因为列表是单独初始化的。
使用封装类
Java中的封装类一般是指将原始数据类型转换为类的对象,或者将类的对象转换为原始数据类型的类。
我们在前面的示例代码中使用了Integer类,这是一个封装类的例子,它封装了原始数据类型 "int"。
我们还可以对数组或对象列表使用封装类。
为了理解包装器类如何帮助在HashMap ,在同一键下获得多个值,让我们看一下下面的代码。
import java.util.HashMap; import java.util.Set; class Wrapped { private String[] combination; public Wrapped(String[] combinations) { this.combination=combinations; } public String[] getcombo() { return this.combination; } } public class Sample { public static void main(String[] args) { HashMap Hmap=new HashMap<>(); String[] l4= {"3+1","2+2","1+3"}; String[] l5= {"4+1","3+2","2+3","1+4"};
Hmap.put(4, new Wrapped(l4));
Hmap.put(5, new Wrapped(l5));
Set keys = Hmap.keySet();
for (Integer i : keys) {
String\[\] temp=Hmap.get(i).getcombo();
System.out.print(i+"=");
for(int j=0;j
输出。
4=[3+1] [2+2] [1+3] 5=[4+1] [3+2] [2+3] [1+4]
在上面的示例代码中,Wrapper类包裹了一个字符串数组,它是该类的私有成员。
因此,在主类中声明的HashMap ,只需要为键实现一个Integer,为值实现一个 "包装 "类的对象,允许我们在同一个键下存储多个值。
使用Java图元
Java中的Tuples提供了另一种组合元素的解决方案。
一个图元被认为是一个有序的数据结构,它可以包含不同的数据类型,这些数据类型可能相互之间没有联系,但作为一个整体却有重要的意义。
关于Tuples值得注意的一点是,它们是不可改变的,即一旦创建,就不能改变。
Java中的Tuples库由许多有用的类组成,如Unit、Pairs、Triplets、Quartets等。
你需要添加以下依赖关系来获得javatuples jar。
https://mvnrepository.com/artifact/org.javatuples/javatuples
为了了解它如何用于在Java中的Hash Map中存储同一键下的多个值,让我们看看下面的代码。
import java.util.HashMap;
import java.util.Set;
import org.javatuples.Triplet;
public class Sample {
public static void main(String[] args) {
HashMap
输出:
4=[1+3, 2+2, 3+1]
这段示例代码使用了JavaTuples 库中的Java Triplet类。
这段代码创建了整数和三联体的哈希图。在填充哈希图时,代码创建了一个Triplet类的对象,如代码中所示。
在JDK 8中使用compute()函数
compute() 如果你使用的是JDK 8或更新的版本,你也可以利用
。 map.compute()函数是一个重映射函数,可以对Java的哈希图内部的值进行操作。
在使用计算函数时需要注意的另一点是,要确保它不改变现有的地图。
因此,这个计算函数可以用来操作数值,使多个数值被添加到同一个键上。
compute() 函数一般用于根据特定条件更新数值。然而,我们可以对其嵌入进行简单的修改,以便使其在我们的用例中发挥作用。
为了理解这个概念是如何工作的,让我们看看下面这段代码。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class Sample {
private static
输出。
4=[1+3, 2+2, 3+1] 5=[1+4, 2+3, 3+2, 4+1]
仔细观察,你可以看到这段代码明确地修改了put()函数,并将其用于插入Hash Map中。
该代码将put() 函数声明为私有静态的,它接受三个参数为Map, Key, 和 Value。
在该函数中,代码使用了map.compute() 函数,该函数在不存在的情况下创建了一个ArrayList ,如果存在,则将新值添加到其中。
总结
以上是在Java中需要向Hash Map的同一个键添加多个值时可以使用的不同方法。
最简单的方法是使用标准库中的数据结构,如ArrayList ,等等。
不过,如果你正在做一个maven项目,使用外部库的MultiMap ,如文章中讨论的google guava和Apache Commons,可能会更方便。
本文还讨论了其他的变通方法,如Java Tuples、Wrapper Class、compute()函数和TreeSet as Values,对于这个问题,可能不容易实现,但根据用例,可以很有效。
以上就是关于如何在Java中为HashMap中的单键添加多个值的全部内容。
希望你能学到新的东西,并喜欢阅读这篇文章。请继续关注更多此类文章。学习愉快!