我正在尝试编写一段代码,该代码采用两位十六进制数字,例如“0C”,并将其与列表进行比较。
我正在使用Java 6,因此无法打开字符串,并且最初计划在Enums上使用开关,但没有意识到Enums必须以字母开头。
有没有一种简单的方法来实现类似下面的内容而没有一系列“if,else if ...”语句?:
public void code(String oc) {
switch (oc) {
case 00:
// do something
break;
case 0A:
// do something else
break;
case A1:
....
}
谢谢, 罗伯特。
答案 0 :(得分:8)
在Java 6中,不可能直接执行此操作。您必须将String值转换为数字(以某种方式),然后打开数字。例如:
switch (Integer.parseInt(oc, 16)) {
case 0x00:
// do something
break;
case 0x0A:
// do something else
break;
case 0xA1:
....
}
字符串到数字转换相对昂贵,并且可能会否定使用switch
的性能优势......除非您有大量不同的情况。
答案 1 :(得分:2)
您可以使用enum
,只需在前面放一个字母,如下所示:
public enum MyEnum {
X00,
X0A,
XA1
// etc
}
public void code(String oc) {
switch (MyEnum.valueOf("X" + oc)) {
case X00:
// do something
break;
case X0A:
// do something
break;
case XA1:
// do something
break;
}
}
答案 2 :(得分:1)
如果您需要为每种情况选择一个元素,您可以将所有内容放入散列图:
private final static Value DEFAULT_VALUE = ...;
private final static HashMap<Key, Value> A_MAP = new HashMap<Key, Value>();
static { // populate the map
A_MAP.put(..., ...);
...
}
// query value for key:
public Value get(final Key key) {
final Value result = A_MAP.get(key);
return result == null ? DEFAULT_VALUE : result;
}
显然,Key和Value需要替换为要使用的具体类型。
答案 3 :(得分:1)
您可以使用地图和反射。 首先初始化地图并为每种情况创建一个方法:
Map<String, Method> cases = new HashMap<String, Method>();
private void doSomething(param1, param2... etc) {
// do your stuff
}
private void doSomethingElse(param1, param2... etc) {
// do other stuff
}
cases.put("00", this.getClass().getMethod("doSomething", param1.class, param2.class, ..);
cases.put("0A", this.getClass().getMethod("doSomethingElse", param1.class, param2.class, ..);
// etc.
然后,当你需要使用开关时:
cases.get(yourCase).invoke(this, param1, param2, etc.);
答案 4 :(得分:1)
您可以使用嵌套开关作为第一个和第二个字符:
char c0 = oc.charAt(0);
char c1 = oc.charAt(1);
switch(c0) {
case '0':
switch(c1) {
case '1':
// ...
}
// ...
}
但只有少数代码可以打开时才能读取。