代码优化:特定字符串的求和值,

时间:2015-06-05 08:27:35

标签: java string java-me integer sum

我正在编写jave-me(Java ME 3.2)MIDlet,其中我使用Mode,Fan和Temperature的变量(这很简单)。当我向Web API发送信息时,我必须将它们更改为十六进制值,因为API将它们作为位读取。 对Web API的响应采用以下格式:AABBCC AA:模式 - 8位(自动,低,冷,风,热,N / A,N / A,OnOff) BB:fanSpeed - 8位(自动,低,中,高,N / A,N / A,N / A,N / A) CC:温度 - 整数

因此,要生成此响应,目前我使用此代码。但它可能更短或更简单。那么我怎样才能优化这段代码:

int firstPart = 0;
    int seccondPart = 0;
    if(climateOn)
    {
        firstPart += 128;
    }
    if(mode.equals("HEAT"))
    {
        firstPart += 16;
    }
    if(mode.equals("WIND"))
    {
        firstPart += 8;
    }
    if(mode.equals("COOL"))
    {
        firstPart += 4;
    }
    if(mode.equals("LOW"))
    {
        firstPart += 2;
    }
    if(mode.equals("AUTO"))
    {
        firstPart += 1;
    }
    if(fanSpeed.equals("HIGH"))
    {
        seccondPart += 8;
    }
    if(fanSpeed.equals("MED"))
    {
        seccondPart += 4;
    }
    if(fanSpeed.equals("LOW"))
    {
        seccondPart += 2;
    }
    if(fanSpeed.equals("AUTO"))
    {
        seccondPart += 1;
    }
    return Integer.toHexString(firstPart) + ""  + Integer.toHexString(seccondPart) + "" +(setTemperature + 19);

2 个答案:

答案 0 :(得分:1)

如果您使用的是Java 7或更高版本,则可以使用switch声明:

switch (mode) {
    case "HEAT": firstPart += 16; break;
    case "WIND": firstPart += 8; break;
    // ...
}

另一个解决方案是将这些数据放在地图中:

static final Map<String, Integer> modes = new HashMap<>();
static {
    modes.put("HEAT", 16);
    modes.put("WIND", 8);
    // ...
}

void someMethod(String mode) {
    // ...
    if (modes.containsKey(mode))
        firstPart += modes.get(mode);
}

你也可以使用这样的枚举:

enum Mode {
    HEAT(16), WIND(8), COOL(4), LOW(2), AUTO(1);
    private final int value;
    private Mode(int value) { this.value = value; }
    public int getValue() {return value;}
}

void someMethod() {
    // ...
    Mode mode = Mode.valueOf(str); // finds the named element. throws IllegalArgumentException
    firstPart += mode.getValue();
}

[编辑] 你甚至可以用枚举做得更好:

enum Mode {
    AUTO, LOW, COOL, WIND, HEAT;

    public int getValue() { return 1 << ordinal(); }
}

ordinal()方法返回枚举中特定常量的序号,从0开始。这意味着它将为AUTO返回0,为LOW返回1,等等而1 << N是计算2来加速N的快速方法。

关于这一点的好处是,它会自动生成正确的值(假设顺序正确),并且它不会为两个枚举产生相同的值。

用法与之前的枚举实现相同。

答案 1 :(得分:0)

您是否了解过java enums?这是一个例子:

public enum Mode {
  Auto,Low,Cool,Wind,Heat,NA,OnOff;
}

枚举可以在switch语句中使用。

此外,您也可以为每个值分配一个字节值。