java - 初始化 ArrayList 的静态映射

标签 java arraylist map static initialization

我想定义一个ArrayList 的静态映射以包含成对的[key, ArrayList object]

随着时间的推移,这些对会添加很多内容,但它们在每次执行期间都是固定的。所以最好的方法是在定义arrayList的映射时进行初始化

我可以通过静态方法来做到这一点,包括:

arrayList.add("value1"), 
arrayList.add("value2"), 
arrayList.add("value3"),
... 

然后:

map.put("key", arrayList)

但是,对于每对 [key, ArrayList],这些必须重复

我尝试了 ImmutableMap,但出现了这个错误:

Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList
    at bugTriaging.Constants.<clinit>(Constants.java:11)

这是我的代码:

package package1;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import com.google.common.collect.ImmutableMap;

public class Constants { 
    static final Map<String, ArrayList<String>> map1 = ImmutableMap.<String, ArrayList<String>>builder()
            .put("key1", (ArrayList<String>) Arrays.asList("value1", "value2", "value3"))
            .put("key2", (ArrayList<String>) Arrays.asList("value4", "value5", "value6", "value7"))
            .put("key3", (ArrayList<String>) Arrays.asList("value8", "value9", "value10", "value11", "value12", "value13"))
            .build();
    
    public static void main(String[] args) {
        System.out.println("Started ...");
    }
}

我玩过静态值和最终值,但无法运行。

最后,我可以运行这段代码:

    @SuppressWarnings("serial") //to avoid the warning.
    public static HashMap<String, ArrayList<String>> map2 = new HashMap<String, ArrayList<String>>() {{
        put("key1", new ArrayList<String>() {{
            add("value1");
            add("value2");
          }});
        put("key2", new ArrayList<String>() {{
            add("value3");
            add("value4");
            add("value5");
          }});
        put("key3", new ArrayList<String>() {{
            add("value6");
            add("value7");
            add("value8");
          }});
    }};
    

这是我的问题:

1- What is the problem of ImmutableMap in my first approach?

2- With my solution, I get warnings ("The serializable class does not declare a static final serialVersionUID field of type long"). Is adding @SuppressWarnings("serial") the right way of getting rid of warnings or there is a better way?

最佳答案

改变-

static final Map<String, ArrayList<String>> map1 = ImmutableMap.<String, ArrayList<String>>builder() 

static final Map<String, List<String>> map1 = ImmutableMap.<String, List<String>>builder()

为什么??

Arrays.asList() 返回一个不同的 ArrayList 而不是 java.util.List。返回的 ArrayList 是 Arrays 类中的静态内部类。


完成初始化:

static final Map<String, List<String>> map1 = ImmutableMap
        .<String, List<String>> builder()
        .put("key1", Arrays.asList(new String[] { "value1", "value2", "value3" }))
        .put("key2", Arrays.asList(new String[] { "value4", "value5", "value6", "value7" }))
        .put("key3",Arrays.asList(new String[]  { "value8", "value9", "value10", "value11", "value12", "value13" })).build();

关于java - 初始化 ArrayList 的静态映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25411503/

相关文章:

c++ - std::shared_ptr 用于 std::map 中的值破坏我的对象

java - 为什么java.lang.Short没有类似于java.lang.Integer的reverse()方法

java - 'BanTransitiveDependencies failed' 背后的原因是什么?

java - 在 Java 中检查 ArrayList 元素(从 csv 文件中提取)并使用所需的逻辑解析它们时出错

c++ - 我如何将 map 的反面复制到另一张 map ?

c++ - 在 C++ 中初始化映射和删除的正确方法

java - JUNIT 条件测试可能吗?

java - 构建一个读取数字并表示它是质数或列出其因数的 Java 程序

将 ArrayList 放入 HashMap 后出现 Java StackOverflowError

java - 从java列表中删除特定元素列表后获取剩余的元素列表?