我需要创建一个静态Map
一个给定的映射String
到数组int
的。
换句话说,我想定义喜欢的东西:
"fred" -> {1,2,5,8}
"dave" -> {5,6,8,10,11}
"bart" -> {7,22,10010}
... etc
有没有一种简单的方法在Java中做到这一点?
如果可能的话,我想用static
常量,既String
和int
值。
编辑:为了澄清我的意思用static
的值的常量,并给予我所看到的是正确的代码,这里是我的解决方案首次尝试:
public final static String FRED_TEXT = "fred";
public final static String DAVE_TEXT = "dave";
public final static int ONE = 1;
public final static int TWO = 2;
public final static int THREE = 3;
public final static int FOUR = 4;
public final static HashMap<String, int[]> myMap = new HashMap<String, int[]>();
static {
myMap.put(FRED_TEXT, new int[] {ONE, TWO, FOUR});
myMap.put(DAVE_TEXT, new int[] {TWO, THREE});
}
请注意,这些名称是不是我真正使用。 这仅仅是一个人为的例子。
你并不需要单独申报和初始化。 如果你知道如何,它都可以在一个行来完成!
// assumes your code declaring the constants ONE, FRED_TEXT etc is before this line
private static final Map<String, int[]> myMap = Collections.unmodifiableMap(
new HashMap<String, int[]>() {{
put(FRED_TEXT, new int[] {ONE, TWO, FOUR});
put(DAVE_TEXT, new int[] {TWO, THREE});
}});
我们在这里是用一个匿名类初始化模块 ,它是一个构造函数后建设执行的代码块,这是我们在这里用来加载地图。
这句法/结构有时被误称为“双括号初始化” - 我想,因为有两个相邻的括号 - 但实际上有没有这样的事情。
这个两个很酷的事情是:
- 它与结婚内容的声明,
- 因为初始化是在网上,你也可以让一个在线调用
Collections.unmodifiableMap()
导致整齐的一行声明,初始化和转换为不可修改的。
如果你并不需要/希望地图是不可修改的,省去了电话:
private static final Map<String, int[]> myMap = new HashMap<String, int[]>() {{
put(FRED_TEXT, new int[] {ONE, TWO, FOUR});
put(DAVE_TEXT, new int[] {TWO, THREE});
}};
需要声明,并分别初始化静态地图。
以下是声明部分:
private static final Map<String,int[]> MyMap;
这里是初始化块:
static {
Map<String,int[]> tmpMap = new HashMap<String,int[]>();
tmpMap.put("fred", new int[] {1,2,5,8});
tmpMap.put("dave", new int[] {5,6,8,10,11});
tmpMap.put("bart", new int[] {7,22,10010});
MyMap = Collections.unmodifiableMap(tmpMap);
}
不幸的是,数组始终用Java写的。 你不会是能够分配MyMap
,但你可以添加或从你的程序访问地图的其他部分删除值。
为了完整起见,因为这是在谷歌的第一个结果为“Java静态定义地图”在Java 8现在你可以做到这一点。
Collections.unmodifiableMap(Stream.of(
new SimpleEntry<>("a", new int[]{1,2,3}),
new SimpleEntry<>("b", new int[]{1,2,3}),
new SimpleEntry<>("c", new int[]{1,2,3}))
.collect(Collectors.toMap((e) -> e.getKey(), (e) -> e.getValue())));
这个漂亮的部分与这是我们不与双括号语法创建匿名类了( {{ }}
然后,我们可以用一些代码扩展,以清理模式类似这样的家伙在这里做http://minborgsjavapot.blogspot.ca/2014/12/java-8-initializing-maps-in-smartest-way.html
public static <K, V> Map.Entry<K, V> entry(K key, V value) {
return new AbstractMap.SimpleEntry<>(key, value);
}
public static <K, U> Collector<Map.Entry<K, U>, ?, Map<K, U>> entriesToMap() {
return Collectors.toMap((e) -> e.getKey(), (e) -> e.getValue());
}
public static <K, U> Collector<Map.Entry<K, U>, ?, ConcurrentMap<K, U>> entriesToConcurrentMap() {
return Collectors.toConcurrentMap((e) -> e.getKey(), (e) -> e.getValue());
}
最后结果
Collections.unmodifiableMap(Stream.of(
entry("a", new int[]{1,2,3}),
entry("b", new int[]{1,2,3}),
entry("c", new int[]{1,2,3}))
.collect(entriesToMap()));
这将给予我们一个并行不可修改的映射。
static Map<String, int[]> map = new HashMap<>();
地图是静态的,您可以访问它,而无需创建它在定义的类的实例。我不知道你的意思是与具有键和值的静态以及什么,因为它是没有意义的我。
public class ExampleClass {
public final static HashMap consts = new HashMap();
static
{
constants.put("A", "The Letter A");
constants.put("B", "The Letter B");
constants.put("C", "The Letter C");
}
/* Rest of your class that needs to know the consts */
}