是否有可能有多个值在哈希表中相同的密钥? 如果没有,你可以建议其可以使用任何这样的类或接口?
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());
}