如何在switch案例中使用Map中的int值?

时间:2016-05-05 13:28:19

标签: java hashmap switch-statement

我有一张地图:

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

现在我添加了一些值:

myMap.put("east", generateId());
myMap.put("west", generateId());
myMap.put("north", generateId());
myMap.put("south", generateId());

现在我正在尝试使用switch case检查匹配项:

int i = myMap.get("east");
int j = myMap.get("west");
int k = myMap.get("north");
int l = myMap.get("south");
switch (myId) {
    case i:
        break;
    case j:
        break;
    case k:
        break;
    case l:
        break;
}

它表示在所有情况下都需要常量表达式(i,j,k,l)。我该如何解决这个问题?

4 个答案:

答案 0 :(得分:6)

你不能。 case标签必须是编译时可评估的常量表达式,i等的值仅在运行时才知道。

改为使用一系列if else语句。

if (myId == i){等。

答案 1 :(得分:1)

由于您只能在switch case中使用值,而不能使用变量,因此您必须更改代码:

Set<Integer> set = new HashSet<Integer>(myMap.size());
set.add(new Integer(myMap.get("east")));
set.add(new Integer(myMap.get("west")));
set.add(new Integer(myMap.get("north")));
set.add(new Integer(myMap.get("south")));

if (set.contains(new Integer(myId))) break;

您可以使用Set来帮助您进行检查(适用于O(1),代码更少)。此外,切换不是OOP所以不要使用它...

答案 2 :(得分:1)

你确定你的地图正确吗?

    Map<Integer, String> myMap = new HashMap<>();
    myMap.put(generateId(), "east");
    myMap.put(generateId(), "west");
    myMap.put(generateId(), "north");
    myMap.put(generateId(), "south");
    switch (myMap.get(1)) {
        case "north":
            break;
        case "south":
            break;
        case "east":
            break;
        case "west":
            break;
    }

答案 3 :(得分:-3)

用于case语句的值必须是常量,这意味着它们必须无法在整个语句中进行更改。您可以通过制作单字母变量final来解决此问题。