具有冲突解决功能的 Java 哈希表



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

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。

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

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

请注意,存在许多 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]

最新更新