2013-04-02 25 views
0

我有点迷失在哪个数据结构用来有效解决我的问题。我想将一个数组映射到一个值。我的意思是,如果我有1000个值,我需要能够将多个其他值映射到1000个值中的每一个值。Java数据结构保存一个值映射到一个数组

例如,

我有1000-1000的A值。对于每个值A,我想映射k个其他值B(这些范围也是1-1000)。但我确实希望确保任何值映射到A都不重复。不同A值之间的映射值可以相同(即2和1000都映射到它们)。

1 -> 138, 92, 835, 841, 12 
    2 -> 766, 324, 26, 933, 62 
    3 -> 53, 131, 62, 121, 67 
    4->160, 160 #NOT OK 
    4-> 162, 171, 594, 912, 455 
    ... 
    1000->146, 981, 67, 246, 146 

所以,当我看到一些任意值A时,我应该很容易识别任何值映射到它的值。所以如果我想访问值3,我应该能够打印出值A(3)及其相关值(53,131,62,121,67)。

我希望这是有道理的。实现这种数据结构的最佳方式是什么?任何解释或例子的帮助将不胜感激。

回答

1

你想套一个数组列表:

ArrayList<Set<Long>> 

集,则该值是在收集一次且仅一次,和当然这个清单是这些收藏的清单。

然后,您可以使用ArrayList上的get(index)方法来获取特定的序号。

ArrayList<Set<Number>> mappings = new ArrayList<Set<Long>>(); 

Set<Long> s = new HashSet<Long>(); 
long[] n = {138, 92, 835, 841, 12}; 
s.addAll(Arrays.toList(n)); 
mappings.add(1, s); 
// etc. 

后来,获取:

Set<Long> result = mappings.get(1); // for element in slot 1... 
+0

这应该很好,非常感谢! – Paul

+0

通过'Map'检索会更容易和高效 –

+0

使用列表(因为序号基本上是map键)并且具有O(1)查找时间,因为它由一个数组支持,所以检索就非常容易的地图。 – PaulProgrammer

2

使用

Map<Long, Set<Long>> numberToValuesMap; 

Set的唯一性

+0

上面的map也可以工作,但是键的自然顺序可能不会保留 - 如果需要维护顺序,您必须在迭代之前对键集进行排序。 – PaulProgrammer

+0

您可以使用'TreeSet'来保存订单 –

0

如果有连续的值(甚至接近连续的),你并不需要“地图”那么 - 你可以使用一个简单的数组阵列:

int[][] a = new int[1001][]; 

然后为每个值,创建int数组:

a[1] = new int[]{138, 92, 835, 841, 12}; 

+0

您将难以确保此实现的“独特”约束。 – PaulProgrammer

+0

这似乎是唯一的缺点。否则,它看起来是非常简单和直接的,我喜欢。 – Paul

相关问题