如何创建字符串的静态地图 - >阵(How to create a static Map of

2019-07-03 23:23发布

我需要创建一个静态Map一个给定的映射String到数组int的。

换句话说,我想定义喜欢的东西:

"fred" -> {1,2,5,8}
"dave" -> {5,6,8,10,11}
"bart" -> {7,22,10010}
... etc

有没有一种简单的方法在Java中做到这一点?

如果可能的话,我想用static常量,既Stringint值。

编辑:为了澄清我的意思用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});
}

请注意,这些名称是不是我真正使用。 这仅仅是一个人为的例子。

Answer 1:

并不需要单独申报和初始化。 如果你知道如何,它都可以在一个行来完成!

// 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});
}};


Answer 2:

需要声明,并分别初始化静态地图。

以下是声明部分:

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 ,但你可以添加或从你的程序访问地图的其他部分删除值。



Answer 3:

为了完整起见,因为这是在谷歌的第一个结果为“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()));

这将给予我们一个并行不可修改的映射。



Answer 4:

static Map<String, int[]> map = new HashMap<>();

地图是静态的,您可以访问它,而无需创建它在定义的类的实例。我不知道你的意思是与具有键和值的静态以及什么,因为它是没有意义的我。



Answer 5:

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 */
}


文章来源: How to create a static Map of String -> Array
标签: java map static