将int映射到int(在Java中)

时间:2015-06-11 18:34:54

标签: java algorithm dictionary integer mapping

在Java中。

如何将一组数字(例如整数)映射到另一组数字? 所有数字都是正数,所有数字在他们自己的集合中都是唯一的。

第一组数字可以有任意值,第二组数字代表数组的索引,因此目标是能够通过第一组中的数字访问第二组中的数字。这是一对一的关联。

速度至关重要,因为必须每秒多次调用该方法。

编辑:我尝试使用SE hashmap实现,但发现它对我的目的来说很慢。

6 个答案:

答案 0 :(得分:2)

您正在寻找的结构称为关联数组。在计算机科学中,关联数组,映射,符号表或字典是由(键,值)对的集合组成的抽象数据类型,这样每个可能的键在集合中只出现一次。

在Java中,特别是已经提到的这可以通过HashMap轻松完成。

HashMap<Integer, Integer> cache = new HashMap<Integer, Integer>();

您可以使用方法put

插入元素
cache.put(21, 42);

您可以使用get

检索值
Integer key = 21
Integer value = cache.get(key);
System.out.println("Key: " + key +" value: "+ value); 

Key: 21 value: 42

如果要迭代数据,则需要定义迭代器:

Iterator<Integer> Iterator = cache.keySet().iterator();

while(Iterator.hasNext()){
  Integer key = Iterator.next();
  System.out.println("key: " + key + " value: " + cache.get(key));
}

答案 1 :(得分:1)

听起来HashMap<Integer,Integer>就是你要找的东西。

答案 2 :(得分:1)

有一篇专门讨论这个问题的文章(有一个解决方案):Implementing a world fastest Java int-to-int hash map

代码可以在相关GitHub repository中找到。 (最佳结果在IntIntMap4a.java类中)

文章引用:

<强>摘要

如果您想优化哈希地图的速度,您必须尽可能多地执行以下列表:

  • 使用容量等于2的基础数组 - 它将允许您使用便宜的&amp;而不是昂贵的数组索引%
  • 不要将状态存储在单独的数组中 - 使用专用字段来获取空闲/删除的键和值。
  • 在一个数组中交错键和值 - 它允许您免费将值加载到内存中。
  • 实施一项策略,以摆脱被删除的&#39;细胞 - 你可以牺牲一些移除性能,以支持更频繁的获取/放置。
  • 在计算初始单元格索引时对密钥进行加扰 - 这是处理连续密钥的情况所必需的。

    是的,我知道如何使用引文格式。但它看起来很糟糕,并且没有很好地处理子弹列表。

答案 3 :(得分:1)

如果您愿意使用外部库,则可以使用apache的IntToIntMap,这是Apache Lucene的一部分。

它实现了一个非常高效的int to int map,它使用原语来完成不应该承受拳击开销的任务。

答案 4 :(得分:1)

如果您对第一个列表的大小有限制,则可以使用大型数组。假设你知道第一个列表只有数字0-99,你可以使用int [100]。使用第一个数字作为数组索引。

答案 5 :(得分:0)

Map界面可以满足您的要求。例如,请参阅HashMap<K,V>

请参阅MapHashMap