我想为具有多个值的键创建自定义哈希表。为此,我想做的是:
1)创建一个大小为Linked Lists / Array-list的数组 Integer_MAX。
2)将值(int)插入到其编号的Linked Lists / Array-list中 是关键数字。
现在,我面临两个问题:
1)如何定义链接列表/数组列表的数组。
2)有没有办法让它们成为原始的?
任何帮助或任何改善它的想法对我都有帮助。
感谢。
编辑:我知道Hash Table概念与具有多个值的键无关。但是,我想这样做。
我想制作一个自定义哈希映射和基元(不是对象,因为它需要非常大的空间,如番石榴)。
答案 0 :(得分:3)
我强烈建议您使用Multimap项目中的guava。您可以使用ArrayListMultiMap并获得您正在寻找的行为。
答案 1 :(得分:2)
使用guava multimap http://tomjefferys.blogspot.com/2011/09/multimaps-google-guava.html和http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Multimaps.html
原语的使用此http://labs.carrotsearch.com/hppc.html或http://fastutil.di.unimi.it/
答案 2 :(得分:2)
1)您可以像任何数组一样定义LinkedLists数组:
LinkedList[] l = new LinkedList[10];
虽然,你应该做一个列表数组:
List[] l = new List[10];
2)数组不是原语。 LinkedLists也不是。此外,LinkedLists只能保存引用,而不是基本类型。如果必须在自定义hashmap类中存储基元,则只需要使用数组,而不是LinkedList或ArrayList。
答案 3 :(得分:1)
如果您需要的是多值地图,请使用集合
http://commons.apache.org/collections/apidocs/org/apache/commons/collections/map/MultiValueMap.html
答案 4 :(得分:1)
你真的检查了Guava + Trove Multimap实现吗?像这样:
final int listCapacity = 10; // Intege.MAX_VALUE isn't an option
final ListMultimap<Integer, Integer> multimap =
Multimaps.newListMultimap(
TDecorators.wrap(
new TIntObjectHashMap<Collection<Integer>>()), //Map<int, Collection>
new Supplier<List<Integer>>() {
@Override
public List<Integer> get() {
return TDecorators.wrap(new TIntArrayList(listCapacity)); //List<int>
}
});
你会得到全面的ListMultimap<Integer, Integer>
,所以你可以这样做:
multimap.putAll(1, Ints.asList(1, 11, 111, 1, 1111));
multimap.putAll(2, Ints.asList(2, 22, 222, 2, 2222));
multimap.put(3, 333);
System.out.println("multimap: " + multimap);
System.out.println("get(2): " + multimap.get(2));
System.out.println("get(3): " + multimap.get(3));
System.out.println("get(4): " + multimap.get(4));
输出:
multimap: {3=[333], 2=[2, 22, 222, 2, 2222], 1=[1, 11, 111, 1, 1111]}
get(2): [2, 22, 222, 2, 2222]
get(3): [333]
get(4): []
并且每个列表都是TIntArrayList
的实例,每个地图都是TIntObjectHashMap
,非常内存效率和优化(您应该尝试使用Map的参数btw)。我不认为你可以构建更多可以同时使用的优化实现。
唯一的缺点是自动装箱成本,但它不会消耗那么多内存,更有可能是时间。