初始化ArrayList的静态Map

3
我想定义一个静态的Map of 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- 我第一次尝试使用ImmutableMap时遇到了什么问题?

2- 使用我的解决方案后,我收到了警告(“可序列化类未声明类型为long的静态final serialVersionUID字段”)。添加@SuppressWarnings("serial")是消除警告的正确方法,还是有更好的方法?


请再次检查导入的内容 com.google.common.collect.ImmutableMap; 这是一个 GWT 项目吗? - Braj
我认为你正在寻找UnmodifiableMap。 - Eran
我已将jar文件guava-10.0.1.jar添加到我的库中。 - Alisa
2个回答

4

变更-

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。返回的 ArrayListArrays 类中的一个静态内部类。


完整初始化:

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

2
  1. ClassCastException出现在第11行,你将Arrays.asList()返回的对象强制转换为ArrayList。问题在于Arrays.asList()返回类型为List的对象(参见http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html),而List不是ArrayList的子类型。因此,要解决这个问题,你可以将Map中存储的值更改为List,或手动构建ArrayList而不使用Arrays.asList()。

  2. 如果你没有序列化任何内容,那么就没关系。参见What does it mean: The serializable class does not declare a static final serialVersionUID field?

我怀疑你使用ImmutableMap的方式存在另一个问题,但我不理解你的问题,因此无法评论。你能重新表述一下你的问题吗?


谢谢你的两个答案。 对于第一个问题,你的评论和@ThelostMind的回答一样有效。 - Alisa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接