假设我要构建一个 small 简单映射,其中键是N个整数(固定,通常是一个),值是M个整数(也是固定的,通常是一个)。
现在我想将数据存储为整数数组,以提高空间效率。我在JVM中编程,但它不应该有所作为,除非算法需要将指针存储为整数。
有没有人定义过可以做到这一点的简单数据结构?
[编辑]我到目前为止的答案似乎表明没有人理解我的问题,所以我会试着澄清一下。首先,忘记M和N;想象一下,我说了一个int键和一个int值。 AFAIK,如果你想使用普通的HashMap,其中键是一个整数,值是一个整数,那么你最终会得到至少2 + 3 * N个对象,其中N是条目数。
我想知道的是,您是否可以将所有这些内容打包在一个原始整数的单个数组中,从而将对象数减少到两个,与密钥数无关。一个用于int [],另一个用于包装器对象,它为您提供了一些类似于地图的界面。我的密钥和我的值都不会为空。而且我也不需要完整的标准java.util.Map实现。我只需要,获取,放置和删除,获取和返回原始ints 而不是Integer对象。访问不需要是O(1),就像在普通的HashMap中一样。
答案 0 :(得分:1)
由于ArrayList(实际上是AbstractList)类已经适当地重写了equals方法,你可以直接使用这样的地图:
Map<List, List> map = new HashMap<List, List>();
答案 1 :(得分:1)
我想我理解这个问题,我会解决一个问题:
实现目标的非常简单的方法是保留单个二维数组int array[NKeys][2]
,其中array[i][0]
是关键,array[i][1]
是M值之一。然后,您可以迭代数组,并对key
的每个查询返回array[i][1]
所有array[i][0] == key
。当然,这适用于单个int键而不是一组int键。而且,这很复杂。如果不添加更多Java对象/ C指针,我无法想到任何其他方法。
答案 2 :(得分:1)
据我所知,答案是否定的,至少不是Java。
但是你可以简单地将你的键和值保存在一个带有匹配索引的int数组(每个)中,如果保持键数组的排序,你可以执行二进制搜索。
Java阵列的问题在于它们是固定大小的结构,因此如果要存储的元素多于分配数组的元素,则重新分配它们非常昂贵。
所以你必须在数组的大小和重新分配的数量之间进行权衡,可能与ArrayList
的方式类似。
另一个更小的问题是int是一个基本类型,没有空值,但你可以指定一个特殊的int值来表示null。