Java 打开以数字开头的两个字符串

Java 打开以数字开头的两个字符串,java,string,enums,switch-statement,Java,String,Enums,Switch Statement,我试着写一段代码,它接受两位数的十六进制数,例如“0C”,并将其与列表进行比较 我使用的是Java6,所以无法切换字符串,最初计划在枚举上使用切换,但没有意识到枚举必须以字母开头 有没有一种简单的方法可以在不使用一系列“if,else if…”语句的情况下实现以下目标 public void code(String oc) { switch (oc) { case 00: // do something break; case 0A:

我试着写一段代码,它接受两位数的十六进制数,例如“0C”,并将其与列表进行比较

我使用的是Java6,所以无法切换字符串,最初计划在枚举上使用切换,但没有意识到枚举必须以字母开头

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

public void code(String oc) {

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

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

switch (Integer.parseInt(oc, 16)) {
case 0x00:
    // do something
    break;
case 0x0A:
    // do something else
    break;
case 0xA1:
    ....
}
字符串到数字的转换相对昂贵,可能会抵消使用
开关的性能优势。。。除非有大量不同的案例。

如果需要为每个案例选择一个元素,可以将所有内容放入hashmap:

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;
}
private最终静态值DEFAULT_Value=。。。;
private final static HashMap A_MAP=new HashMap();
静态{//填充映射
一张地图。放(…,…);
...
}
//键的查询值:
公共值获取(最终密钥){
最终值结果=A_MAP.get(键);
返回结果==null?默认值:result;
}

显然,键和值需要替换为要使用的具体类型。

您可以使用
枚举,只需在前面放一个字母,如下所示:

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;
     }
}

可以使用贴图和反射。 首先初始化映射并为每种情况创建一个方法:

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.

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

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

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

但是,只有在代码很少的情况下,这才是可读的。

您不应该根据在switch语句中是否可用来选择要使用的适当类型。如果是枚举,则使用枚举。如果是字符串,请使用字符串。我真的不明白切换if/else if的好处。啊,好的。有人告诉我,对于这类事情,开关比if/else更有效。如果不是这样的话,我将使用If/else方法。您可以使用接口定义所需的函数,并将它们放在hashmap中。但是你把十六进制数转换成字符串,然后发现你更喜欢一个数字。为什么要皈依?你在预先优化。这是万恶之源。这不是性能问题的地方。Switch在大多数情况下效率更高,但它是“万恶之源”类型的过早微优化的完美例子:您不知道代码的这一部分是否与性能相关,但您愿意浪费时间并牺牲您的设计来优化它。+1当然,但你不是该有个头像了吗?或者你想成为一个拥有最高代表性的匿名用户?是什么让你认为那不是一个化身?有些人很尖刻:-)无论如何,乔纳森·莱夫勒(Jonathon Leffler)拥有这个头衔,我没有机会击败他的代表(这不是一场比赛…:-)你只落后他3万。来吧你能行!(但如果你一直像刚才一样被拥有,那就不行了——他想要一个enum解决方案,我给了他一个:D)“先生,你是一个越界者和一个cad!我要求满足!黎明时的手枪!”:-):-)谢谢。有几百个开关,所以可能不合适,但不管怎样,最好知道。
    char c0 = oc.charAt(0);
    char c1 = oc.charAt(1);

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