将 int 映射到 int(在 Java 中)

Mapping int to int (in Java)

在Java.

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

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

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

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

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

Map接口可以满足您的要求。例如,参见 HashMap<K,V>

Map and HashMap

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

在 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));
}

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

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

文章引用:


总结

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

  • 使用容量等于 2 的幂的底层数组 - 它将允许您使用便宜的 & 而不是昂贵的 % 作为数组索引
  • 不要将状态存储在单独的数组中 - 为 free/removed 键和值使用专用字段。
  • 在一个数组中交错放置键和值 - 这将允许您免费将一个值加载到内存中。
  • 实施删除 'removed' 单元格的策略 - 您可以牺牲一些删除性能以支持更频繁的 get/put。
  • 在计算初始单元格索引时对密钥进行打乱-这是处理连续密钥的情况所必需的。

    是的,我知道如何使用引文格式。但它看起来很糟糕并且不能很好地处理项目符号列表。

如果愿意使用外部库,可以使用apache的IntToIntMap, which is a part of Apache Lucene

它实现了一个非常高效的 int 到 int 映射,该映射使用原语执行不应遭受装箱开销的任务。

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