2013-04-02 27 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

相關問題