我有点迷失在哪个数据结构上用来有效地解决我的问题。我想将数组映射到一个值。我的意思是,如果我有1000个值,我需要能够将多个其他值映射到1000个值中的每一个。
例如,
我有1-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)。
我希望这是有道理的。实现这种数据结构的最佳方法是什么?任何解释或示例的帮助都将非常感激。
答案 0 :(得分:2)
使用
Map<Long, Set<Long>> numberToValuesMap;
Set
表示唯一性
答案 1 :(得分:1)
您需要一组数据列表:
ArrayList<Set<Long>>
Set要求值只在集合中一次,当然列表是这些集合的列表。
然后,您可以使用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...
答案 2 :(得分:0)
如果你有连续值(甚至接近连续),你不需要“映射” - 你可以使用一个简单的数组数组:
int[][] a = new int[1001][];
然后为每个值创建一个int:
数组a[1] = new int[]{138, 92, 835, 841, 12};
等