令人困惑的Double Brace Initilizated Array

时间:2015-12-15 05:28:45

标签: java android

我对这个有数组列表的hashmap有点困惑。我希望动态添加每个条目。

我尝试了很多次,但我无法动态添加条目。有什么建议吗?

   HashMap<String, List<Attraction>> ATTRACTIONS =
                new HashMap<String, List<Attraction>>() {{

                    put("Sydney", new ArrayList<Attraction>() {{
                        add(new Attraction(
                                "Sydney Opera House",
                                "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed vitae bibendum justo, vitae cursus velit. Suspendisse potenti.",
                                "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed vitae bibendum justo, vitae cursus velit. Suspendisse potenti. Suspendisse scelerisque risus justo, non tincidunt nibh blandit et. Vivamus elit lacus, luctus nec erat in, pharetra semper turpis. Quisque viverra nulla ligula, non pulvinar ante dictum sit amet. Vestibulum aliquet tortor mauris, vel suscipit nisl malesuada eget. Aliquam maximus dictum euismod. Maecenas leo quam, volutpat id diam eget, placerat fringilla ipsum. Nam pretium vehicula augue quis euismod.\n\nNam sed blandit magna. Vestibulum a fermentum arcu. Vestibulum et ligula at nisi luctus facilisis. Proin fermentum enim a nibh commodo finibus. Suspendisse justo elit, vulputate ut ipsum at, pellentesque auctor massa. Praesent vestibulum erat interdum imperdiet dapibus. In hac habitasse platea dictumst. Proin varius orci vitae tempor vulputate.\n\nEtiam sed mollis orci. Integer et ex sed tortor scelerisque blandit semper id libero. Nulla facilisi. Pellentesque tempor magna eget massa ultrices, et efficitur lectus finibus.",
                                Uri.parse("https://lh5.googleusercontent.com/-7fb5ybQhUbo/VGLWjIL4RmI/AAAAAAAAACM/2jLe_msj_tk/w600-no/IMG_0049.JPG"),
                                Uri.parse("https://lh3.googleusercontent.com/-EFEw6s7mT6I/VGLkCH4Xt4I/AAAAAAAAADY/ZlznhaQvb8E/w600-no/DSC_2775.JPG"),
                                new LatLng(-33.858667, 151.214028),
                                "Sydney"
                        ));
                    }});

                }};

2 个答案:

答案 0 :(得分:1)

  

我尝试过使用其他方法,但我希望在没有黑客的情况下这样做。

如果没有双括号,你可以写一些类似

的东西
Map<String, List<Attraction>> ATTRACTIONS = new HashMap<>();
List<Attraction> al = new ArrayList<>();
al.add(new Attraction("Sydney Opera House",
    "Lorem ipsum ...",
    "Lorem ipsum ...",
    Uri.parse(
        "https://lh5.googleusercontent.com/-7fb5ybQhUbo/VGLWjIL4RmI/AAAAAAAAACM/2jLe_msj_tk/w600-no/IMG_0049.JPG"),
    Uri.parse(
        "https://lh3.googleusercontent.com/-EFEw6s7mT6I/VGLkCH4Xt4I/AAAAAAAAADY/ZlznhaQvb8E/w600-no/DSC_2775.JPG"),
    new LatLng(-33.858667, 151.214028), "Sydney"));
ATTRACTIONS.put("Sydney", al);

如果您想为“悉尼”添加其他景点,请将其添加到al。如果您想在ATTRACTIONS添加其他城市,请务必创建new List<Attraction>

答案 1 :(得分:1)

如果我们解释“双支撑黑客”实际上在做什么,也许会有所帮助。这是一个更简单的例子:

Map<String, String> test =
            new HashMap<String, String>() 
{
    {
        put("key", "value");
        put("key2", "value2");
    }
};

第1行是声明。没什么有趣的。

第2行是匿名类声明的开始。我们正在创建HashMap的子类。

第3行启动匿名类主体。

第4行启动实例初始化程序块

第5行&amp;初始化程序块中的6个语句

初始化程序块的第7行结束

匿名类主体的第8行结束。

匿名类通过从匿名类默认构造函数链接到HashMap no-args构造函数来工作。然后执行初始化程序,在put(...)上调用this。最终结果是预先填充的hashmap。

然后我们删除了一堆空格,我们得到:

HashMap<String, String> test = new HashMap<String, String>(){{
    put("key", "value");
    put("key2", "value2");
}};

对于列表,您可以使用add而不是put。但是,还有另一种(IMO)更简单的方法来创建预先填充的列表:

  List<String> test2 = Arrays.asList(new String[]{"One", "Two", "Tree"});