Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中硬编码映射的替代方法?_Java_Hashmap - Fatal编程技术网

Java中硬编码映射的替代方法?

Java中硬编码映射的替代方法?,java,hashmap,Java,Hashmap,我的Java程序中有一个HashMap,由大约200个键值对组成,在运行时不会改变,我正在寻找一种初始化所有键值对的好方法。 目前我有一个像这样的硬编码方法 private void initializeHashMap(){ hashMap.put(1, "String1"); hashMap.put(2, "String2"); hashMap.put(3, "String3"); ...} 总共200对。 这真的是一个很好的实践,还是有另一种更好的方法来读取来自另一

我的Java程序中有一个HashMap,由大约200个键值对组成,在运行时不会改变,我正在寻找一种初始化所有键值对的好方法。 目前我有一个像这样的硬编码方法

private void initializeHashMap(){
    hashMap.put(1, "String1");
    hashMap.put(2, "String2");
    hashMap.put(3, "String3");
...}
总共200对。
这真的是一个很好的实践,还是有另一种更好的方法来读取来自另一个类或外部文件的数据?

< P>这是一个完美的用例来考虑文件。当您阅读文件时,它会为您提供一个方便的地图来使用它。

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

Map<Integer,String> myMap = new HashMap<Integer,String>(){{
    this.put(1, "String1");
    this.put(2, "String2");
}};
Map myMap=newhashmap(){{
本条第(1)款(“第1条”);
本.put(2,“String2”);
}};

现在,您不再实例化
HashMap
,而是一个扩展它的匿名类。这个匿名类的定义包含一个实例初始值设定项块,它将在构造函数之后执行,并将设置所需的键/值。

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

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]
        ));
String[]contents=新字符串[]{
“1:String1”,
“2:String2”,
“3:3”
};
Map hashMap=Arrays.stream(内容)
.collect(collector.toMap)(
//钥匙。
s->Integer.valueOf(s.split(“:”[0]),
//价值观。
s->s.split(“:”[1]
));

数据列表更容易维护,您可以经常从电子表格中保持它的最新。例如,

< P>您可以考虑属性文件,因为它将返回您的映射,并且有助于配置和测试。

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

   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());
}
公共类数据{
私有静态类MyMap扩展了HashMap{
私有静态最终长serialVersionUID=1l;
私有MyMap(){
本条第(1)款(“第1条”);
本.put(2,“string2”);
本.put(3,“string3”);
本.put(4,“string4”);
}
}
public static final Map 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) : "";

   }
 }
classyourclass{
私有静态最终地图;
静止的{
map=Data.fixedData;
}
公共最终字符串getValue(最终整型键){
返回map.containsKey(键)?map.get(键):“”;
}
}

从配置文件中读取数据是一种更好的做法,因为您可以在不更改代码的情况下更改映射的内容。如果映射实际上包含key=1、value-string1、key=2、value=string2,则这是一种简单的循环情况。否则,我建议使用属性文件来保存这些键值对,并使用属性来读取和创建map@akshayapandey不需要从中创建地图。属性是Map的一个实现。@suresh.你是对的,但是在他的问题中提到了hashmap,我也提到过。我知道OP不关心性能,但这只是过份的,比如将相同的值拆分2倍等等,而且容易出错。我希望没有人对他们的解决方案采用这个答案。@Gunhan分裂不是问题的关键-我试图表达的是将数组流到
Map
中。