我很好奇如何才能更有效地实例化Java中的字典。目前,我有可传递的代码,但是我以一种非常模糊的方式填充了数据。

有什么办法可以像这样初始化字典吗?记录的是python:

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);
    }
  }
}

非常感谢你!

最佳答案

这是我所知道的最好的技术:

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

注意双括号-这通常称为双括号初始化。

您实际上正在做的是创建一个扩展HashMap的匿名内部类,新的子类包含一个初始化程序块,您可以在其中调用保证可以在使用实例之前执行的任何任意代码。

还要注意,无论出于何种原因,“钻石运算符”都不能与匿名类一起使用。

对于测试类来说,这是一种不错的技术,但是对于生产代码,我倾向于避免使用它。

编辑:以为我应该回答您的实际问题!

双括号初始化可能是“纯” Java中的最佳解决方案,您的Map具体如下所示:
    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"); }});
    }};

...仍然不是 super 棒。 Java确实确实需要Map文字,但是它没有一个。

对于生产代码,我将使用Guava的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");

关于java - 用Java干净地初始化带有一组特定数据的字典,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35006135/

10-11 22:37
查看更多