Java - 自定义哈希表

时间:2012-07-31 20:36:22

标签: java

我想为具有多个值的键创建自定义哈希表。为此,我想做的是:

  

1)创建一个大小为Linked Lists / Array-list的数组   Integer_MAX。

     

2)将值(int)插入到其编号的Linked Lists / Array-list中   是关键数字。

现在,我面临两个问题:

  

1)如何定义链接列表/数组列表的数组。

     

2)有没有办法让它们成为原始的?

任何帮助或任何改善它的想法对我都有帮助。

感谢。

编辑:我知道Hash Table概念与具有多个值的键无关。但是,我想这样做。

我想制作一个自定义哈希映射和基元(不是对象,因为它需要非常大的空间,如番石榴)。

5 个答案:

答案 0 :(得分:3)

我强烈建议您使用Multimap项目中的guava。您可以使用ArrayListMultiMap并获得您正在寻找的行为。

答案 1 :(得分:2)

答案 2 :(得分:2)

1)您可以像任何数组一样定义LinkedLists数组:

LinkedList[] l = new LinkedList[10];

虽然,你应该做一个列表数组:

List[] l = new List[10];

2)数组不是原语。 LinkedLists也不是。此外,LinkedLists只能保存引用,而不是基本类型。如果必须在自定义hashmap类中存储基元,则只需要使用数组,而不是LinkedList或ArrayList。

答案 3 :(得分:1)

答案 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)。我不认为你可以构建更多可以同时使用的优​​化实现。

唯一的缺点是自动装箱成本,但它不会消耗那么多内存,更有可能是时间。