1

我想获取特定键的所有值(多个)。但我只得到一个值?我不知道如何打印所有值。如果有人更正代码,会有很大的帮助..没有从谷歌搜索中获得任何帮助。 .

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:输出是defabc jklghi。我想要abcdef defabc ghijkl jklghi。

4

8 回答 8

8

哈希表每个键只能包含一个值。要存储多个值,您应该

  1. 每个键存储一个集合(例如List<String>或数组)。请注意,您必须在插入与该键对应的第一个值之前初始化集合
  2. 使用多图

请注意,存在许多 MultiMap 实现。Oracle 文档也提供了一个简单的实现(参见此处,并搜索MultiMap

于 2012-07-03T11:03:00.743 回答
4

HashMap 的工作方式是给定键只有一个值。所以如果你打电话:

map.put(key, value1);
map.put(key, value2);

第二行将覆盖键对应的值。

关于您对碰撞的评论,它意味着不同的东西。在内部,HashMap 将键/值对存储在基于键的哈希码定义的桶中(因此名称为:hashmap)。在两个不相等的键具有相同的哈希码的情况下(如果哈希码函数良好,则概率很低),实现需要确保在其中一个键上查询哈希图将返回正确的值。这就是需要处理哈希冲突的地方。

于 2012-07-03T11:02:16.327 回答
2

这不是冲突解决的目的。冲突解决可让您处理具有不同键的两个对象将进入哈希映射中的相同“桶”的情况。这个解决方案是如何发生的是哈希映射实现的内部细节,而不是暴露给你的东西。

于 2012-07-03T11:04:09.207 回答
1

实际上,在您的情况下,它不是冲突,而是具有相同哈希码的相同键。通常,只有当两个不同的键生成相同的 hashcode时才会发生冲突,这可能是由于hashCode()方法的错误实现而发生的。

是的,java.util.HashMap将处理哈希冲突,如果您查看 的源代码HashMap,它将每个值存储在LinkedList. 这意味着,如果两个具有相同哈希码的不同键进入......那么这两个值将进入同一个桶,但作为linked list.

在网上找到了这个链接,它详细解释了哈希映射是如何工作的。

于 2012-07-03T11:23:06.367 回答
0

如果 key 相同,则更新 value。jvm 不会为相同的键放置新的键/值...

于 2012-07-03T11:02:17.230 回答
0

Hashtable<String, String>将一个字符串映射到一个字符串。因此put替换之前链接到特定键的值。

如果你想要多个值,你可以制作 aHashtable<String, []String>或 a Hashtable<String, List<String>>

更简洁的解决方案是使用 Google 的Multimap,它允许将多个值关联到一个键:

类似于 Map 的集合,但可以将多个值与单个键相关联。如果您使用相同的键但值不同的两次调用 put(K, V),则多重映射包含从键到两个值的映射。

于 2012-07-03T11:02:31.317 回答
0

您只为每个键放置一个字符串:

hasht.put(key,ary[i]);

因此,如果 i=1 这意味着您 put defabc,为什么您期望为同一个键获得多个值?

于 2012-07-03T11:03:13.063 回答
0

Hashtable,像所有 Map 一样,每个键只保留一个值,即您设置的最后一个值。

如果要保留所有值,只需打印原始数组。

String[] ary = "abcdef,defabc,ghijkl,jklghi".split(",");
System.out.println(Arrays.toString(ary));

印刷

[abcdef, defabc, ghijkl, jklghi]
于 2012-07-03T11:04:47.180 回答