在Java中。
如何将一组数字(例如整数)映射到另一组数字? 所有数字都是正数,所有数字在他们自己的集合中都是唯一的。
第一组数字可以有任意值,第二组数字代表数组的索引,因此目标是能够通过第一组中的数字访问第二组中的数字。这是一对一的关联。
速度至关重要,因为必须每秒多次调用该方法。
编辑:我尝试使用SE hashmap实现,但发现它对我的目的来说很慢。
答案 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类中)
文章引用:
<强>摘要强>
如果您想优化哈希地图的速度,您必须尽可能多地执行以下列表:
在计算初始单元格索引时对密钥进行加扰 - 这是处理连续密钥的情况所必需的。
是的,我知道如何使用引文格式。但它看起来很糟糕,并且没有很好地处理子弹列表。
答案 3 :(得分:1)
如果您愿意使用外部库,则可以使用apache的IntToIntMap,这是Apache Lucene的一部分。
它实现了一个非常高效的int to int map,它使用原语来完成不应该承受拳击开销的任务。
答案 4 :(得分:1)
如果您对第一个列表的大小有限制,则可以使用大型数组。假设你知道第一个列表只有数字0-99,你可以使用int [100]。使用第一个数字作为数组索引。
答案 5 :(得分:0)