在Java中硬编码Map的其他方法是什么?

时间:2017-11-09 10:06:32

标签: java hashmap

我的Java程序中有一个HashMap,它包含大约200个-Key-Value-pair,它们在运行时不会发生变化,我正在寻找一种初始化所有对的好方法。 目前我有一个像这样的硬编码方法

private void initializeHashMap(){
    hashMap.put(1, "String1");
    hashMap.put(2, "String2");
    hashMap.put(3, "String3");
...}

所有200对。 这是非常好的做法,还是有另一种更好的方法可能是从另一个类或外部文件中读取数据?

4 个答案:

答案 0 :(得分:4)

这是考虑properties文件的完美用例。当你阅读文件时,它会为你提供一个方便的地图来玩它。

答案 1 :(得分:1)

在可读性方面更糟糕但在简洁性方面更好(我将在个人项目中使用但在团队工作中避免使用)的另一种方法是使用匿名类来定义其在实例化时的键/值:

Map<Integer,String> myMap = new HashMap<Integer,String>(){{
    this.put(1, "String1");
    this.put(2, "String2");
}};

现在你不再实例化一个HashMap,而是一个扩展它的匿名类。这个匿名课程#39; definition包含一个实例初始化程序块,它将在构造函数之后执行,并将设置所需的键/值。

答案 2 :(得分:0)

我发现使用硬编码数组的流可以是一个非常简洁的方法。

String[] contents = new String[] {
        "1:String1",
        "2:String2",
        "3:String3"
};
Map<Integer,String> hashMap = Arrays.stream(contents)
        .collect(Collectors.toMap(
                // Key.
                s -> Integer.valueOf(s.split(":")[0]),
                // Value.
                s -> s.split(":")[1]
        ));

数据列表更易于维护,您通常可以从电子表格中保持最新状态。

答案 3 :(得分:0)

您可以考虑属性文件,因为它会返回您的地图,它有助于配置和测试。

如果您有兴趣维护一个单独的类,那么您可以继续使用实例块

   public Class Data{
      private static class MyMap extends HashMap<Integer, String>{
          private static final long serialVersionUID=1l;
          private MyMap(){
                this.put(1,"string1");
                this.put(2,"string2");
                this.put(3,"string3");
                this.put(4,"string4");
         }
      }
  public static final Map<Integer, String> fixedData=Collections.unmodifiable(new MyMap());
}

然后在课堂上你可以使用如下。

Class YourClass{
     private static final Map<Integer, String> map;
      static{
        map=Data.fixedData;
      }

   public final String getValue(final int key){
      return map.containsKey(key) ? map.get(key) : "";

   }
 }