打开以数字开头的双字符串

时间:2012-06-22 10:48:12

标签: java string enums switch-statement

我正在尝试编写一段代码,该代码采用两位十六进制数字,例如“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:
                   ....
             }

谢谢, 罗伯特。

5 个答案:

答案 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':
            // ...
        }
        // ...
    }

但只有少数代码可以打开时才能读取。