2

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

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

2)将值(int's)插入到编号为键编号的链接列表/数组列表中。

现在,我面临两个问题:

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

2)有什么方法可以让它们变得原始?

任何帮助或任何使它变得更好的想法都会对我有所帮助。

谢谢。

编辑:我知道哈希表概念与具有多个值的键无关。但是,我想让它变成那样。

我想制作一个自定义哈希映射和原语(不是对象,因为它需要像番石榴这样的巨大空间)。

4

5 回答 5

3

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

于 2012-07-31T20:41:36.307 回答
2

1) 像任何数组一样定义一个 LinkedLists 数组:

LinkedList[] l = new LinkedList[10];

虽然,你可能应该做一个列表数组来代替:

List[] l = new List[10];

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

于 2012-07-31T20:44:08.610 回答
1

如果您需要的是多值映射,请使用 Collections

http://commons.apache.org/collections/apidocs/org/apache/commons/collections/map/MultiValueMap.html

于 2012-07-31T20:38:58.977 回答
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 的参数)。我认为您无法构建同时可用的更优化的实现。

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

于 2012-07-31T21:52:33.107 回答