2012-06-22 3 views
2

Я пытаюсь написать фрагмент кода, который принимает двухзначное шестнадцатеричное число, например. «0C», и сравнивает его со списком.Включить двухсимвольную строку, начинающуюся с цифры

Я использую Java 6, поэтому не могу включить строку и изначально планировал использовать переключатель Enums, но не понимал, что Enums должны начинаться с буквы.

Есть простой способ добиться чего-то вроде следующего без целого ряда «если еще, если ...» заявления ?:

public void code(String oc) { 

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

Спасибо, Роберта.

+1

Вы не должны выбирать подходящий тип для использования в зависимости от того, может ли он использоваться в инструкции коммутатора или нет. Используйте перечисление, если это перечисление. Используйте String, если это String. Я действительно не понимаю преимущества переключателя if/else if. –

+0

Ах, хорошо. Кто-то сказал мне, что переключатель был более эффективным, чем if/else для этого типа вещей. Если это не так, я пойду по маршруту if/else. – Robert

+0

Вы можете использовать интерфейс, определяющий желаемую функцию, и помещать их в хэш-карту. Но вы конвертируете шестнадцатеричные числа в строку, а затем обнаруживаете, что предпочитаете номер. Зачем конвертировать? –

ответ

8

В Java 6 это невозможно сделать напрямую. Вам нужно преобразовать значения String в числа (как-то), а затем включить числа. Например:

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

Строка преобразования номер является относительно дорогим, и, вероятно, сводит на нет выигрыш в производительности, используя switch ... если у вас есть большое количество различных случаев.

+0

+1 уверенно, но не так ли, когда вы получили аватар? Или вы пытаетесь быть пользователем инкогнито с наивысшим представителем? – Bohemian

+0

Что заставляет вас думать, что это не аватар? Некоторые люди очень spikey :-) –

+0

Stephen C, который работал удовольствие. Большое спасибо, сэр! – Robert

1

Если вам нужно выбрать ровно один элемент для каждого случая, вы можете поместить все в 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; 
} 

Очевидно ключ и значение должны быть заменены конкретными типами, которые будут использоваться.

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

Это тоже помогает, спасибо. – Robert

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.); 
1

вы можете использовать вложенные ключи для первого и второго символа :

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

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

, но это доступно для чтения только в том случае, если есть только несколько кодов для включения.

+0

Спасибо. Есть пара сотен, чтобы включить, возможно, не подходящую, но хорошо знать независимо. – Robert

Смежные вопросы