我想获取特定键的所有值(多个)。但我只得到一个值?我不知道如何打印所有值。如果有人纠正代码,会有很大帮助。没有得到谷歌搜索的任何帮助。
import java.util.*;
public class hashing
{
public static void main(String args[])
{
String[] ary=new String[4];
String key;
char[] chrary;
ary[0]=new String("abcdef");
ary[1]=new String("defabc");
ary[2]=new String("ghijkl");
ary[3]=new String("jklghi");
Hashtable<String, String> hasht = new Hashtable<String, String>();
for(int i=0;i<4;i++){
chrary=ary[i].toCharArray();
Arrays.sort(chrary);
key=new String(chrary);
hasht.put(key,ary[i]);
}
Enumeration iterator = hasht.elements();
while(iterator.hasMoreElements()) {
String temp = (String)iterator.nextElement();
System.out.println(temp);
}
}
}
PS:output is defabc jklghi.我想要abcdef defabc ghijkl jklghi。
每个键只能包含一个值。要存储多个值,您应该
- 存储集合(例如
List<String>
或数组)每个键。请注意,在插入与该键对应的第一个值之前,必须初始化集合 - 使用多重地图
请注意,存在许多 MultiMap 实现。Oracle文档也提供了一个简单的实现(请参阅此处,并搜索MultiMap)
HashMaps的工作方式是给定键只有一个值。因此,如果您致电:
map.put(key, value1);
map.put(key, value2);
第二行将覆盖与键对应的值。
关于你对碰撞的评论,这意味着不同的东西。在内部,HashMap 将键/值对存储在存储桶中,这些存储桶是根据键的哈希码定义的(因此得名:hashmap)。在两个不相等的键具有相同的哈希码的情况下(如果哈希代码函数良好,则概率较低),实现需要确保查询其中一个键上的哈希映射将返回正确的值。这就是需要处理哈希冲突的地方。
这不是冲突解决方案的目的。 冲突解决允许您处理具有不同键的两个对象进入哈希映射中的同一"存储桶"的情况。此解决方案如何发生是哈希映射实现的内部细节,而不是向您公开的内容。
实际上,在您的情况下,它不是冲突,而是具有相同哈希码的相同键。通常,仅当两个不同的键生成相同的哈希码时,才会发生冲突,这可能是由于hashCode()
方法的实现不当而发生的。
是的,java.util.HashMap
会处理哈希冲突,如果你看一下HashMap
的源代码,它会将每个值存储在一个LinkedList
中。这意味着,如果两个具有相同哈希码的不同键进来。然后这两个值将进入同一个存储桶,但作为linked list
中的两个不同节点。
在线找到此链接,其中详细解释了哈希映射的工作原理。
如果键相同,则值将被更新。 JVM不会为相同的键放置新的键/值...
您的Hashtable<String, String>
将一个字符串映射到一个字符串。因此,put
替换之前链接到特定键的值。
如果需要多个值,可以创建一个Hashtable<String, []String>
或一个Hashtable<String, List<String>>
。
更干净的解决方案是使用谷歌的Multimap,它允许将多个值关联到一个键:
类似于 Map 的集合,但可能关联多个值 用一个键。如果您调用 put(K, V) 两次,使用相同的键,但 不同的值,多重映射包含从键到两者的映射 值。
你只为每个键放置一个字符串:
hasht.put(key,ary[i]);
因此,如果 i=1,这意味着您输入defabc
,为什么您希望为同一个键获得多个值?
哈希表,像所有 Map 一样,每个键只保留一个值,即您设置的最后一个值。
如果要保留所有值,只需打印原始数组。
String[] ary = "abcdef,defabc,ghijkl,jklghi".split(",");
System.out.println(Arrays.toString(ary));
指纹
[abcdef, defabc, ghijkl, jklghi]