2009-11-09 60 views
5

將二維數組轉換爲哈希映射最簡單的方法是什麼?將靜態二維字符串數組轉換爲哈希映射

例如,藉此:

 
final String[][] sheetMap = { /* XSD Name, XSL Sheet Name */ 
           {"FileHeader", "FileHeader"}, 
           {"AccountRecord", "AccountRecord"}, 
           {"DriverCardRecord", "DriverCardRecord"}, 
           {"AssetCardRecord", "AssetCardRecord"}, 
           {"SiteCardRecord", "SiteCardRecord"} 
          }; 

這是最有可能會被從文件中加載並會更大。

+0

我也許應該補充的是,除了剛剛通過的元素,我現在所做的循環,在那裏我可以只使用一個集合方法將這個二維數組傳遞給一個HashMap實例? – Casey 2009-11-09 17:41:05

+1

不是我意識到的 - 我認爲它不可能實現比所有數組元素上的簡單循環更有效的方法。所以你不會獲得任何超出一些簡潔的東西,你可以通過將它放在你自己的'Utils'類中來重複。 – 2009-11-09 17:44:27

回答

20
final Map<String, String> map = new HashMap<String, String>(sheetMap.length); 
for (String[] mapping : sheetMap) 
{ 
    map.put(mapping[0], mapping[1]); 
} 
+0

+1你打敗了我只有秒:-) – 2009-11-09 17:42:03

+1

+1:有時最簡單的解決方案=是=最好的解決方案。 – DivineWolfwood 2009-11-09 17:51:25

4

如果你只是想初始化你十分方便地地圖,你可以使用double brace initialization

Map<String, String > sheetMap = new HashMap<String, String >() {{ 
    put("FileHeader", "FileHeader"); 
    put("AccountRecord", "AccountRecord"); 
    put("DriverCardRecord", "DriverCardRecord"); 
    put("AssetCardRecord", "AssetCardRecord"); 
    put("SiteCardRecord", "SiteCardRecord"); 
}}; 
+0

這可能會產生一些負面影響,並被廣泛認爲是反模式 - https://blog.jooq.org/2014/12/08/dont-be-clever-the-double-curly-braces-anti-pattern/ – 2017-02-17 20:14:52

2

等待;如果這將要從文件加載,不要經過中間陣列步驟!在創建數組之前,您必須首先加載它,否則您不會知道數組的大小。只需創建一個HashMap並在讀取它時添加每個條目。

+0

是的,這是計劃。但是,我現在不知道信息將被存儲在哪裏,所以我只是硬編碼到陣列中。它的確提出了一個問題,即集合框架是否已經包含了一個實用方法來完成這個任務,即使它實現起來微不足道。我寧願儘可能在集合中使用一種方法。 – Casey 2009-11-10 13:07:48

+0

啊。好吧,沒錯。如果是這樣,它會接受一些東西的集合,而不是一個數組。也許是Map.Entry的。但這不是非常有用。循環更好。 – 2009-11-10 20:44:43

0

現有的答案很好地工作,當然,但在與新的信息不斷更新這個網站的興趣,這裏有一個辦法做到這一點在Java中8:

String[][] arr = {{"key", "val"}, {"key2", "val2"}}; 
HashMap<String, String> map = Arrays.stream(arr) 
     .collect(HashMap<String, String>::new, 
       (mp, ar) -> mp.put(ar[0], ar[1]), 
       HashMap<String, String>::putAll); 

的Java 8 Stream s爲真棒,我鼓勵你看看他們對於更詳細的信息,但這裏是這個特定操作的基本知識:

  • Arrays.stream會得到一個Stream<String[]>的工作。
  • collect需要您的Stream並將其減少爲收集所有成員的單個對象。它有三個功能。第一個函數,供應商,生成一個收集成員的對象的新實例,所以在我們的例子中,只是創建一個HashMap的標準方法。第二個函數accumulator定義瞭如何將Stream的成員包含到目標對象中,在這種情況下,我們只需將put中的鍵和值(定義爲每個數組的第一個和第二個值)映射到映射中。第三個功能是組合器,它可以組合兩個目標對象,萬一出於某種原因,JVM決定執行多個HashMap s的累加步驟(在這種情況下,或者其他任何其他目標對象),然後需要將它們組合成一個,主要用於異步執行,儘管這通常不會發生。
1

至於tradeJmark回答稍微清潔的替代:

String[][] arr = // your two dimensional array 
Map<String, String> arrMap = Arrays.stream(arr).collect(Collectors.toMap(e -> e[0], e -> e[1])); 

// Sanity check! 
for (Entry<String, String> e : arrMap.entrySet()) { 
    System.out.println(e.getKey() + " : " + e.getValue()); 
}