0

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

例如,

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

    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)。

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

4

3 回答 3

2

采用

Map<Long, Set<Long>> numberToValuesMap;

Set为了独特性

于 2013-04-02T03:05:17.633 回答
1

你想要一个集合的数组列表:

ArrayList<Set<Long>>

Set 要求值在集合中只有一次,当然列表是这些集合的列表。

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

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...
于 2013-04-02T03:10:20.690 回答
0

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

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

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

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

ETC

于 2013-04-02T03:16:05.760 回答