2016-01-26 50 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; 
} 

很明显,你可以更改数据格式和解析代码以满足您的特定需求。