我需要初始化一个常量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]
我没有找到任何显示如何做到这一点的例子。
答案 0 :(得分:216)
你可以这样做:
Map<String, Integer> hashMap = new HashMap<String, Integer>()
{{
put("One", 1);
put("Two", 2);
put("Three", 3);
}};
答案 1 :(得分:55)
您可以使用Google Guava的ImmutableMap。只要您不关心稍后修改Map(在使用此方法构造它后无法在地图上调用.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
答案 2 :(得分:38)
从Java 9开始,可以使用Map.of(...)
,如下所示:
Map<String, Integer> immutableMap = Map.of("One", 1,
"Two", 2,
"Three", 3);
此地图是不可变的。如果您希望地图是可变的,则必须添加:
Map<String, Integer> hashMap = new HashMap<>(immutableMap);
如果您不能使用Java 9,那么您将自己编写类似的帮助方法或使用第三方库(如Guava)来为您添加该功能。
答案 3 :(得分:8)
Java没有地图文字,因此没有很好的方法可以完全按照你的要求去做。
如果您需要这种类型的语法,请考虑一些与Java兼容的Groovy,并允许您这样做:
def map = [name:"Gromit", likes:"cheese", id:1234]
答案 4 :(得分:6)
这是一个简单的课程,可以实现你想要的目标
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}
答案 5 :(得分:6)
地图还在Java 9中添加了工厂方法。对于最多10个条目,地图重载了构造函数,这些构造函数包含成对的键和值。例如,我们可以建立一个不同城市及其人口的地图(根据谷歌在2016年10月),如下所示:
Map<String, Integer> cities = Map.of("Brussels", 1_139000, "Cardiff", 341_000);
Map的var-args情况有点困难,你需要同时拥有键和值,但在Java中,方法不能有两个var-args参数。因此,通过采用Map.Entry<K, V>
对象的var-args方法并添加构造它们的静态entry()
方法来处理一般情况。例如:
Map<String, Integer> cities = Map.ofEntries(
entry("Brussels", 1139000),
entry("Cardiff", 341000)
);
答案 6 :(得分:3)
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
的声明(这是避免“无法访问的声明”诊断所必需的),从技术上讲,它只是一个声明。
答案 7 :(得分:1)
您可以将此实用程序功能添加到实用程序类:
public static <K, V> Map<K, V> mapOf(Object... keyValues) {
Map<K, V> map = new HashMap<>();
for (int index = 0; index < keyValues.length / 2; index++) {
map.put((K)keyValues[index * 2], (V)keyValues[index * 2 + 1]);
}
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
答案 8 :(得分:0)
基于@Dakusan(定义扩展HashMap的类)提出的解决方案,我是这样做的:
public static HashMap<String,String> SetHash(String...pairs) {
HashMap<String,String> rtn = new HashMap<String,String>(pairs.length/2);
for ( int n=0; n < pairs.length; n+=2 ) rtn.put(pairs[n], pairs[n + 1]);
return rtn;
}
.. 并以这种方式使用它:
HashMap<String,String> hm = SetHash( "one","aa", "two","bb", "tree","cc");
(不确定这样是否有任何缺点(我不是 Java 开发人员,只需要在 Java 中执行一些任务),但它有效并且在我看来很舒服。)
答案 9 :(得分:-1)
另一种方法可能是编写特殊函数,通过regular-expression从一个字符串中提取所有元素值:
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;
}
}