在一个语句中一次添加多个条目到一个HashMap

我需要初始化一个常量HashMap,并希望在一行语句中完成。 避免这样的事情:

hashMap.put("One", new Integer(1)); // adding value into HashMap hashMap.put("Two", new Integer(2)); hashMap.put("Three", new Integer(3)); 

类似于目标C中的这个:

 [NSDictionary dictionaryWithObjectsAndKeys: @"w",[NSNumber numberWithInt:1], @"K",[NSNumber numberWithInt:2], @"e",[NSNumber numberWithInt:4], @"z",[NSNumber numberWithInt:5], @"l",[NSNumber numberWithInt:6], nil] 

我还没有find任何示例说明如何做到这一点看了这么多。

你可以这样做:

 Map<String, Integer> hashMap = new HashMap<String, Integer>() {{ put("One", 1); put("Two", 2); put("Three", 3); }}; 

你可以使用Google Guava的ImmutableMap。 这个工作只要你不关心修改地图(在使用这个方法构build地图之后你不能在地图上调用.put()):

 import com.google.common.collect.ImmutableMap; // For up to five entries, use .of() Map<String, Integer> littleMap = ImmutableMap.of( "One", Integer.valueOf(1), "Two", Integer.valueOf(2), "Three", Integer.valueOf(3) ); // For more than five entries, use .builder() Map<String, Integer> bigMap = ImmutableMap.<String, Integer>builder() .put("One", Integer.valueOf(1)) .put("Two", Integer.valueOf(2)) .put("Three", Integer.valueOf(3)) .put("Four", Integer.valueOf(4)) .put("Five", Integer.valueOf(5)) .put("Six", Integer.valueOf(6)) .build(); 

另请参阅: http : //docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/ImmutableMap.html

一个有点相关的问题: 地图中的HashMap的ImmutableMap.of()解决方法?

在Java 9中,可以使用Map.of(...) ,如下所示:

 Map<String, Integer> immutableMap = Map.of("One", 1, "Two", 2, "Three", 3); 

这张地图是不可变的。 如果你想要地图是可变的,你必须添加:

 Map<String, Integer> hashMap = new HashMap<>(immutableMap); 

在此之前,你一直在自己编写一个类似的帮助方法,或者使用第三方库(如Guava )为你添加这个function。

Java没有地图文字,所以没有很好的方法来完成你所要求的。

如果您需要这种types的语法,请考虑一些与Java兼容的Groovy,并允许您执行以下操作:

 def map = [name:"Gromit", likes:"cheese", id:1234] 
  boolean x; for (x = false, map.put("One", new Integer(1)), map.put("Two", new Integer(2)), map.put("Three", new Integer(3)); x;); 

忽略x的声明(这是避免“无法访问的声明”诊断所必需的),从技术上讲,这只是一个声明。

这是一个简单的课程,可以完成你想要的任务

 import java.util.HashMap; public class QuickHash extends HashMap<String,String> { public QuickHash(String...KeyValuePairs) { super(KeyValuePairs.length/2); for(int i=0;i<KeyValuePairs.length;i+=2) put(KeyValuePairs[i], KeyValuePairs[i+1]); } } 

然后使用它

 Map<String, String> Foo=QuickHash( "a", "1", "b", "2" ); 

这产生{a:1, b:2}

您可以将此实用程序function添加到实用程序类:

 public static <K, V> Map<K, V> mapOf(Object... keyValues) { Map<K, V> map = new HashMap<>(); K key = null; for (int index = 0; index < keyValues.length; index++) { if (index % 2 == 0) { key = (K)keyValues[index]; } else { map.put(key, (V)keyValues[index]); } } return map; } Map<Integer, String> map1 = YourClass.mapOf(1, "value1", 2, "value2"); Map<String, String> map2 = YourClass.mapOf("key1", "value1", "key2", "value2"); 

注意:在Java 9您可以使用Map.of

在Java 9中,地图还添加了工厂方法。对于最多10个条目,地图具有重载的构造函数,它们需要成对的键和值。 例如,我们可以build立一个各个城市及其人口的地图(根据谷歌在2016年10月)如下:

 Map<String, Integer> cities = Map.of(“Brussels”, 1_139000, “Cardiff”, 341_000); 

Map的var-args情况有点困难,你需要同时拥有键和值,但是在Java中,方法不能有两个var-args参数。 因此,一般情况下,通过采用Map.Entry对象的var-args方法并添加构造它们的静态entry()方法来处理。 例如:

 Map<String, Integer> cities = Map.ofEntries( entry(“Brussels”, 1139000), entry(“Cardiff”, 341000)); 

Java 9中的集合工厂方法

另一种方法可能是写一个特殊的函数,通过正则expression式从一个string中提取所有的元素值:

 import java.util.HashMap; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Example { public static void main (String[] args){ HashMap<String,Integer> hashMapStringInteger = createHashMapStringIntegerInOneStat("'one' => '1', 'two' => '2' , 'three'=>'3' "); System.out.println(hashMapStringInteger); // {one=1, two=2, three=3} } private static HashMap<String, Integer> createHashMapStringIntegerInOneStat(String str) { HashMap<String, Integer> returnVar = new HashMap<String, Integer>(); String currentStr = str; Pattern pattern1 = Pattern.compile("^\\s*'([^']*)'\\s*=\\s*>\\s*'([^']*)'\\s*,?\\s*(.*)$"); // Parse all elements in the given string. boolean thereIsMore = true; while (thereIsMore){ Matcher matcher = pattern1.matcher(currentStr); if (matcher.find()) { returnVar.put(matcher.group(1),Integer.valueOf(matcher.group(2))); currentStr = matcher.group(3); } else{ thereIsMore = false; } } // Validate that all elements in the given string were parsed properly if (currentStr.length() > 0){ System.out.println("WARNING: Problematic string format. given String: " + str); } return returnVar; } }