在Java中多值哈希表(Multi-valued hashtable in Java)

2019-06-24 06:20发布

是否有可能有多个值在哈希表中相同的密钥? 如果没有,你可以建议其可以使用任何这样的类或接口?

Answer 1:

号这是一种哈希表的想法。

但是,您既可以滚你自己用Map<YourKeyObject, List<YourValueObject>>和创建列表中的一些实用方法,如果它不存在,或者使用类似Multimap从谷歌集合 。

例:

String key = "hello";
Multimap<String, Integer> myMap = HashMultimap.create();
myMap.put(key, 1);
myMap.put(key, 5000);
System.out.println(myMap.get(key)); // prints either "[1, 5000]" or "[5000, 1]"
myMap = ArrayListMultimap.create();
myMap.put(key, 1);
myMap.put(key, 5000);
System.out.println(myMap.get(key)); // always prints "[1, 5000]"

请注意, Multimap是不是自制的解决方案完全等效; Hashtable同步所有的方法,而Multimap不作任何这样的保证。 这意味着使用Multimap ,如果你使用的是它在多线程可能会造成问题。 如果你的地图只使用一个线程,它会使没有区别(你应该一直使用HashMap代替Hashtable反正)。



Answer 2:

哈希表的值是对象,所以你可以存储列表



Answer 3:

而不是给另一个multipmap答案,我会问你为什么要这么做?

相关的多个值吗? 如果是的话,那么它可能是你最好创建一个数据结构来保存它们。 如果没有,那么也许它更适合使用单独的地图。

您准备把它们放在一起,这样就可以根据按键重复呢? 你可能想寻找一个替代索引数据结构,就像一个SkipList。



Answer 4:

在哈希表中,应当使用一个密钥/值对来存储信息。

在Java中, Hashtable类接受单个键单个值。 下面是企图多个值给单个键关联的一个示例:

Hashtable<String, String> ht = new Hashtable<String, String>();

ht.put("Answer", "42");
ht.put("Hello", "World");    // First value association for "Hello" key.
ht.put("Hello", "Mom");      // Second value association for "Hello" key.

for (Map.Entry<String, String> e : ht.entrySet()) {
  System.out.println(e);
}

在试图包含多个值( "World""Mom" ),以一个键( "Hello" ),我们最终得到以下结果打印在条目Hashtable

Answer=42
Hello=Mom

键/值对的"Hello""World"是不是在Hashtable -只有第二个"Hello"和“ Mom ”条目是在Hashtable 。 这表明,一个人不能有多个值与在单个键关联Hashtable


此时真正需要的是一个多重映射 ,它允许多个值到一个关键的关联。

multimap中的一个实现方式是Multimap从谷歌集合 :

Multimap<String, String> mm = HashMultimap.create();

mm.put("Answer", "42");
mm.put("Hello", "World");
mm.put("Hello", "Mom");

for (Map.Entry<String, String> e : mm.entries()) {
  System.out.println(e);
}

这类似于上述其中使用的示例中Hashtable ,但行为是完全不同的-一个Multimap允许多个值,以一个单一的键的关联。 执行上面的代码的结果如下:

Answer=42
Hello=Mom
Hello=World

可以看出,对于"Hello"键,值"Mom""World"与它相关联。 不同于Hashtable ,它不会放弃的一个值,并用另一个替换。 该Multimap能够坚持到多个值的每个关键。



Answer 5:

正如其他人所指出的,没有。 相反,考虑使用Multimap其可以为同一个键映射多个值。

谷歌集合更新 : 番石榴 )库包含一个实现,并可能是你最好的选择。

编辑 :当然,你可以做埃里克建议 ,并集合存储在您的哈希表(或地图,更普遍)的值,但是这意味着自己写的不必要的样板代码。 当使用像谷歌集合库,它会采​​取低层次的“管道工”对你的照顾。 看看这个很好的例子 ,如何您的代码将使用而不是香草Java集合类Multimap之简化。



Answer 6:

答案没有表示什么,我会做第一关。

我曾经在我OO能力所做的最大跳是当我决定总是给另一个类时,它看起来像它可能是稍微有用的 - 这是我从下面这个模式学到的东西之一。

几乎所有的时间,我觉得有我试图将它放在哈希表中的对象之间的关系。 通常情况下,有房的一类 - 甚至是方法或两个。

事实上,我经常发现我甚至不希望一个HashMap类型的结构 - 一个简单的HashSet做精。

你是存储作为主键的项目可以成为一个新的对象的身份 - 所以你可以创建一个只引用一个对象(Eclipse可以让你的equals和哈希方法可以轻松地)等于和哈希方法。 这样的新对象将保存,整理和检索完全按照原来的人做,然后使用属性来存储项目的其余部分。

大多数时候,当我这样做,我觉得有几个方法是去那里,以及之前,我知道它,我有一个成熟的对象,应该是那里所有沿,但我从来不承认,和一堆垃圾因素超出我的代码。

为了使更多的是“婴儿步”,我通常会创建包含在我的原班新类 - 有时我甚至包含一个方法中的类,如果是有意义的范畴这种方式 - 然后我将它各地,因为它变得更加清晰,它应该是一个一流的类。



Answer 7:

只是让你自己:

Map<Object, List<Object>> multiMap = new HashMap<Object, List<Object>>();

加上:

  public void add(String key, Object o) {
    List<Object> list;
    if (multiMap.containsKey(key)) {
      list = multiMap.get(key);
      list.add(o);
    } else {
      list = new ArrayList<Object>();
      list.add(o);
      multiMap.put(key, list);
    }
  }


Answer 8:

看到谷歌集合库为屈德宁和类似这样的集合。 内置的集合不具备这种直接的支持。



Answer 9:

你正在寻找的是一个Multimap之 。 在谷歌集合API提供了一个很好的实现这一点,很多其他是值得学习使用。 强烈推荐!



Answer 10:

您需要使用一种叫做多重映射 。 这不是严格意义上的地图然而,这是一个不同的API。 这是大致相同的地图<K,名单<V >>,但你不会有这样的entrySet()方法或值()。



Answer 11:

简单。 取而代之的Hashtable<Key, Value> ,使用Hashtable<Key, Vector<Value>>



Answer 12:

除了谷歌集合有一个阿帕奇百科全书集合对象Multimap之



Answer 13:

下面,未经谷歌番石榴库代码。 它是用于双值为键和排序顺序

Map<Double,List<Object>> multiMap = new TreeMap<Double,List<Object>>();

for( int i= 0;i<15;i++)
{
    List<Object> myClassList = multiMap.get((double)i);
    if(myClassList == null)
    {
        myClassList = new ArrayList<Object>();
        multiMap.put((double) i,myClassList);
    }
    myClassList.add("Value "+ i);
}

List<Object> myClassList = multiMap.get((double)0);
if(myClassList == null)
{
    myClassList = new ArrayList<Object>();
    multiMap.put( (double) 0,myClassList);
}
myClassList.add("Value Duplicate");
for (Map.Entry entry : multiMap.entrySet()) 
{
  System.out.println("Key = " + entry.getKey() + ", Value = " +entry.getValue());
}


文章来源: Multi-valued hashtable in Java