用Java干净地初始化带有特定数据集的字典

Neu*_*ode 5 java dictionary initialization

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

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

westernCanadaAdjList =  {  'BC': ['AB'],
                       'AB': ['BC', 'SK'],
                       'SK': ['AB', 'MB'],
                       'MB': ['SK']
                        }
Run Code Online (Sandbox Code Playgroud)

我发现出于演示目的,这一点要清晰得多。

我当前在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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

非常感谢你!

rom*_*afe 8

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

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

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

您实际上正在做的是创建一个扩展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"); }});
    }};
Run Code Online (Sandbox Code Playgroud)

...仍然不是超级棒。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");
Run Code Online (Sandbox Code Playgroud)


Ian*_* Mc 2

我同意路易斯的观点,并不想添加任何内容。

在这种情况下使用流可以让您将代码压缩为一行,但我意识到这不是您问题的答案(只是我能想到的最接近的答案)。

        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()));
Run Code Online (Sandbox Code Playgroud)