我有一张地图:
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)。我该如何解决这个问题?
答案 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
来解决此问题。