2

「0C」などの2桁の16進数を取り込んで、リストと比較するコードを作成しようとしています。

私はJava6を使用しているため、文字列をオンに切り替えることができず、最初は列挙型でスイッチを使用することを計画していましたが、列挙型が文字で始まる必要があることに気づいていませんでした。

一連の「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

1番目と2番目の文字にネストされたスイッチを使用できます。

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

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

ただし、これは、オンにするコードが少ない場合にのみ読み取り可能です。

于 2012-06-22T11:17:34.183 に答える
1

ケースごとに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;
}

明らかに、キーと値は、使用する具体的なタイプに置き換える必要があります。

于 2012-06-22T11:03:20.113 に答える
1

Map と Reflection を使用できます。最初にマップを初期化し、ケースごとに 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 に答える