2012-07-03 249 views
1

我想要得到的特定key.But即时得到只有一个值的所有值(倍数)的Java哈希表?我不知道如何打印所有values.Great帮助,如果有人纠正code..did没有得到谷歌搜索任何帮助..与冲突解决

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.I想ABCDEF defabc ghijkl jklghi。

回答

8

散列表只能包含一个每个键的值。要存储多个值,您应该要么

  1. 为每个密钥存储集合(例如List<String>或数组)。请注意,您必须集合初始化与该键对应
  2. 使用MultiMap

注意,许多多重映射实现存在的第一个值插入之前。甲骨文的文档提供了一个简单的实现过(见here,并搜索Multimap之

+0

已将您的链接更新至...以及不指向Guava v3的文档现在在v12上时。 –

4

方式HashMaps这样的工作是有只有一个给定的键值。因此,如果您致电:

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

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

关于你对碰撞的评论,它意味着不同的东西。在内部,HashMap将key/value对存储在基于密钥哈希码定义的桶中(因此名称为hashmap)。在两个不相等的密钥具有相同的哈希码的情况下(哈希码功能很好的情况下为低概率),实现需要确保查询其中一个密钥的哈希映射将返回正确的值。这就是需要处理散列冲突的地方。

+0

在技术上不真实, Woot4Moo

+0

@ Woot4Moo迂回地,也是不真实的。列表可以被认为是一个单一的值。 – millimoose

+0

但是,然后我看到一个教程,它说哈希表使用单独的链接来解决冲突... – Dhatri

0

如果密钥相同,则会更新该值。 JVM会不会把新的键/值对相同的键...

0

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

如果需要多个值,你可以做一个Hashtable<String, []String>Hashtable<String, List<String>>

一个清洁的解决方案是使用谷歌的Multimap它允许多个值到一个键相关联:

类似的地图收藏,但它可以 与单个键关联多个值。如果您使用相同的密钥( 不同的值)调用put(K,V)两次,则multimap包含从密钥到 值的映射。

0

你只把每个键一个字符串:

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

所以,如果我= 1,则意味着你把defabc ,你为什么期望获得同一个键的多个值?

+0

我读了一个教程,哈希表使用单独的链接冲突解决.. – Dhatri

+0

只需阅读您的文章的所有答案,你会得到它。 – Tomer

2

这不是冲突解决方案的意图。碰撞分辨率让你处理这种情况,当两个物体与不同的键会进入哈希映射中相同的“桶”。这个解决方案如何发生是哈希映射实现的内部细节,而不是会暴露给你的东西。

0

散列表,像所有地图一样,每个键只保留一个值,这是您设置的最后一个值。

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

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

打印

[abcdef, defabc, ghijkl, jklghi] 
1

其实,你的情况,它不是碰撞,它与相同的hashCode相同的密钥。通常碰撞发生只有当两个不同的密钥产生相同的散列码时,这可能是由于方法的实施不好造成的。

是的,java.util.HashMap将处理散列冲突,如果你看看HashMap的源代码,它将每个值存储在LinkedList。这意味着,如果两个具有相同散列码的不同密钥进入..那么这两个值将进入相同的存储桶,但是存在于linked list中的两个不同节点。

发现这个link在线,它解释了哈希映射如何工作的细节。