2016-01-26 52 views
2

我很好奇我如何更有效地實例化Java中的字典。目前我有可以通過的代碼,但我用非常混淆的方式填充數據。在Java中用一組特定的數據初始化字典

有什麼辦法讓我初始化我的字典嗎?這是蟒蛇的記錄:

westernCanadaAdjList = { 'BC': ['AB'], 
         'AB': ['BC', 'SK'], 
         'SK': ['AB', 'MB'], 
         'MB': ['SK'] 
         } 

我發現爲了演示的目的,這是一個更加清晰。

我當前的代碼在Java中:

public class Main { 

public static void main(String[] args) { 

    //Adjacency List representation through a dictionary. Allows fast O(1) lookup time. 
    Map<String,ArrayList<String>> adjList = new HashMap<String,ArrayList<String>>(); 


    //Adding values for Edmonton 
    adjList.put("Edmonton", new ArrayList<String>()); 
    adjList.get("Edmonton").add("Neighbour1"); 
    adjList.get("Edmonton").add("Neighbour2"); 
    adjList.get("Edmonton").add("Neighbour3"); 


    //Adding values for Vancouver 
    adjList.put("Vancouver", new ArrayList<String>()); 
    adjList.get("Vancouver").add("V neighbour1"); 
    adjList.get("Vancouver").add("V neighbour2"); 

    System.out.println(adjList.keySet() +" And Values " + adjList.values()); 

    for (String neighbour: adjList.get("Edmonton")){ 
     System.out.println(neighbour); 
    } 

    for (String neighbour: adjList.get("Vancouver")){ 
     System.out.println(neighbour); 
    } 
    } 
} 

非常感謝您!

+0

也許在一個文本文件中將你的映射定義爲JSON,並用像Jackson這樣的解析器讀取它? – Riaz

+0

不,Java沒有你希望的集合文字。 –

回答

1

我同意路易斯,並沒有打算添加任何東西。

在這種情況下使用流允許您將代碼壓縮到一行,但我意識到這不是您的問題的答案(只是爲了最接近我能想到的)。

 Map<String, List<String>> adjList = Stream.of(
      new SimpleEntry<>("Edmonton", Arrays.asList("E N1", "E N2", "E N3")), 
      new SimpleEntry<>("Vancouver", Arrays.asList("V N1", "V N2", "V N3"))) 
      .collect(Collectors.toMap((e) -> e.getKey(), (e) -> e.getValue())); 
1

這是我所知道的最好的技術:

Map<String, String> myMap = new HashMap<String, String>() {{ 
     put("foo", "bar"); 
     put("key", "value"); 
     //etc 
    }}; 

注意雙括號 - 這通常被稱爲雙括號初始化。

實際上你在做的是創建一個匿名內部類來擴展HashMap,並且你的新子類包含一個初始化塊,你可以在這個塊中調用任何可以在實例使用前保證執行的任意代碼。

另請注意,無論出於何種原因,「鑽石運算符」都不能與匿名類一起使用。

這是一個很好的測試類技術,但我傾向於避免它用於生產代碼。

編輯:想到我應該回答你的實際問題!

雙括號初始化可能是「純」 Java中的最佳解決方案,您的地圖將具體樣子:

Map<String, List<String>> westernCanadaAdjList = new HashMap<String, List<String>>() {{ 
     put("BC", new ArrayList<String>(){{ add("AB"); }}); 
     put("AB", new ArrayList<String>(){{ add("BC"); add("SK"); }}); 
     put("SK", new ArrayList<String>(){{ add("AB"); add("MB"); }}); 
     put("MB", new ArrayList<String>(){{ add("SK"); }}); 
    }}; 

...還沒超級真棒。 Java實際上確實需要一個Map文字,並沒有一個。

對於生產代碼,我會使用一個番石榴的MultiMap,但老實說,用文字填充它也好不了多少:

Multimap<String, String> multimap = ArrayListMultimap.create(); 
    multimap.put("BC", "AB"); 
    multimap.put("AB", "BC"); 
    multimap.put("AB", "SK"); 
    multimap.put("SK", "SK"); 
    multimap.put("SK", "SK"); 
    multimap.put("SK", "SK"); 
2

是的,你可以:解析它作爲JSON:

import com.fasterxml.jackson.databind.ObjectMapper; 

String json = "{'BC': ['AB']," + 
       "'AB': ['BC', 'SK']," + 
       "'SK': ['AB', 'MB']," + 
       "'MB': ['SK']" 
       "}"; 

Map<String, Object> map = new ObjectMapper().readValue(json, HashMap.class); 
1

我最近面臨類似的問題。我將數據表示爲一個2d數組,相對容易輸入和解析,並編寫了一個實用程序方法將其解析爲數據結構。例如對於你的情況

static String[][] CANADA_DATA = { 
    {"BC"," AB"}, 
    {"AB","BC","SK"}, 
    // rest of Canada here 
} 

示例代碼

public Map<String, List<String>> parseIt() { 

    Map<String, List<String>> map = new HashMap(); 

    for (String[] provinceData : CANADA_DATA) { 
     String name = provinceData [0]; 
     ArrayList neighbors = new ArrayList(Arrays.asList(provinceData)); 
     neighbors.remove(0); // remove ourself 
     map.put(name, neighbors); 
    } 

    return map; 
} 

很明顯,你可以更改數據格式和解析代碼以滿足您的特定需求。