2

我正在尝试编写一段代码,该代码采用两位十六进制数,例如“0C”,并将其与列表进行比较。

我正在使用 Java 6,因此无法打开字符串,最初计划在 Enums 上使用 switch,但没有意识到 Enums 必须以字母开头。

有没有一种简单的方法可以在没有一系列“if,else if ...”语句的情况下实现以下目标?:

public void code(String oc) {

switch (oc) {
    case 00:
        // do something
        break;
    case 0A:
        // do something else
        break;
    case A1:
                   ....
             }

谢谢,罗伯特。

4

5 回答 5

8

在 Java 6 中,无法直接执行此操作。您必须将字符串值转换为数字(以某种方式),然后打开数字。例如:

switch (Integer.parseInt(oc, 16)) {
case 0x00:
    // do something
    break;
case 0x0A:
    // do something else
    break;
case 0xA1:
    ....
}

字符串到数字的转换相对昂贵,并且可能会抵消使用switch... 的性能优势,除非您有大量不同的情况。

于 2012-06-22T10:54:54.167 回答
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;
     }
}
于 2012-06-22T11:04:30.127 回答
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 需要替换为要使用的具体类型。

于 2012-06-22T11:03:20.113 回答
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.);
于 2012-06-22T11:06:13.283 回答
1

您可以对第一个和第二个字符使用嵌套开关:

    char c0 = oc.charAt(0);
    char c1 = oc.charAt(1);

    switch(c0) {
    case '0':
        switch(c1) {
        case '1':
            // ...
        }
        // ...
    }

但这只有在只有很少的代码可以打开时才可读。

于 2012-06-22T11:17:34.183 回答