{1,2,5,8} "dave" -> {5,6,8,10,11} "-6ren">
gpt4 book ai didi

java - 如何创建 String -> Array 的静态映射

转载 作者:搜寻专家 更新时间:2023-10-30 19:48:42 24 4
gpt4 key购买 nike

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

换句话说,我想定义如下内容:

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

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

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

编辑:为了阐明值的 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});
}});

我们这里有一个带有 initialization block 的匿名类,这是在构造函数之后执行构造函数的代码块,我们在此处使用它来加载 map 。

这种语法/构造有时被错误地称为“双括号初始化”——我想是因为有两个相邻的括号——但实际上并没有这样的东西。

这两个很酷的事情是:

  • 它将声明与内容结合起来,并且
  • 因为初始化是内联的,您还可以对 Collections.unmodifiableMap() 进行内联调用,从而实现简洁的单行声明、初始化和不可修改的转换。

如果您不需要/希望 map 不可修改,请忽略该调用:

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

关于java - 如何创建 String -> Array 的静态映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13445701/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com