2017-02-07 3 views
2

Я пытаюсь преобразовать Excel VBA код в Java. Поскольку коммутатор Java не принимает условный случай, я смущен тем, как придумать элегантный код без кучи if else.Преобразование VBA условно Переключение на Java без большого количества, если есть

Код VBA, который у меня есть.

  Select Case a 
       Case Is < 12 
        b = (3000 + c) * 1.1 
       Case 12 
        b = 4000 + c 
       Case Is < 18 
        b = (4000 + c) * 1.1 
       Case 18 
        b = 4500 + c 
       Case Is < 24 
        b = (4500 + c) * 1.1 
       Case 24 
        b = 5000 + c 
       Case Is < 30 
        b = (5000 + c) * 1.1 
       Case 30 
        b = 5500 + c 
       Case Is < 36 
        b = (5500 + c) * 1.1 
       Case 36 
        b = 6000 + c 
      End Select 

Код, который я не хочу делать в Java.

if(a<12) 
     b = (3000 + c) * 1.1; 
    if(a==12) 
     b = 4000 + c; 
    if(a<18) 
     b = (4000 + c) * 1.1; 
    . 
    . 
    . 
    . 
    . 

Есть ли лучшее решение для этого? Любые предложения и реализации приветствуются.

+0

Мм да. Hashmap число. 12 -> 4000 18 -> 5000 или что-то еще, а затем вам нужно только два оператора if (для граничных случаев) и карточный вызов. – DejaVuSansMono

+0

Nevermind, я думал, что уравнение одинаково для каждого, но это не – DejaVuSansMono

ответ

0

Исходный код имеет ненужное дублирование и по этой причине вы не должны пытаться копировать его как есть. Или, если вы хотите это сделать, вам нужно использовать длинный блок if-else на Java, которого вы хотели избежать (и должны).

Вместо этого, я думаю, вам следует проанализировать основные (бизнес) логику и рефакторинг соответственно.

Что-то вроде:

// assumes the given integer values are positive 
public static double calculate(int a, int c) { 
    final double coefficient = 1.1; 
    final int multiplier = 6; 
    final int increment = 500; 
    final int baseValue = 3000; 

    if (a < 12) { 
     return (baseValue + c) * coefficient; 
    } 

    if (a <= 36) { 
     // int division is truncated to nearest int value 
     int result = ((a/multiplier) * increment) + baseValue + c; 
     if (a % multiplier == 0) { 
      return result; 
     } else { 
      return result * coefficient; 
     } 
    } 
    throw new IllegalArgumentException("Invalid value for a (" + a + ")"); 
} 

тестовый прогон кода:

public static void main(String... args) { 
     final int c = 100; 
     for (int a = 1; a < 37; a++) { 
      System.out.println("calculate a:[" + a + "] for c:[" + c + "]. Result: [" + String.format("%.2f", calculate(a, c)) + "]"); 
     } 
    } 

Консоль вывода:

calculate a:[1] for c:[100]. Result: [3410,00] 
calculate a:[2] for c:[100]. Result: [3410,00] 
calculate a:[3] for c:[100]. Result: [3410,00] 
calculate a:[4] for c:[100]. Result: [3410,00] 
calculate a:[5] for c:[100]. Result: [3410,00] 
calculate a:[6] for c:[100]. Result: [3410,00] 
calculate a:[7] for c:[100]. Result: [3410,00] 
calculate a:[8] for c:[100]. Result: [3410,00] 
calculate a:[9] for c:[100]. Result: [3410,00] 
calculate a:[10] for c:[100]. Result: [3410,00] 
calculate a:[11] for c:[100]. Result: [3410,00] 
calculate a:[12] for c:[100]. Result: [4100,00] 
calculate a:[13] for c:[100]. Result: [4510,00] 
calculate a:[14] for c:[100]. Result: [4510,00] 
calculate a:[15] for c:[100]. Result: [4510,00] 
calculate a:[16] for c:[100]. Result: [4510,00] 
calculate a:[17] for c:[100]. Result: [4510,00] 
calculate a:[18] for c:[100]. Result: [4600,00] 
calculate a:[19] for c:[100]. Result: [5060,00] 
calculate a:[20] for c:[100]. Result: [5060,00] 
calculate a:[21] for c:[100]. Result: [5060,00] 
calculate a:[22] for c:[100]. Result: [5060,00] 
calculate a:[23] for c:[100]. Result: [5060,00] 
calculate a:[24] for c:[100]. Result: [5100,00] 
calculate a:[25] for c:[100]. Result: [5610,00] 
calculate a:[26] for c:[100]. Result: [5610,00] 
calculate a:[27] for c:[100]. Result: [5610,00] 
calculate a:[28] for c:[100]. Result: [5610,00] 
calculate a:[29] for c:[100]. Result: [5610,00] 
calculate a:[30] for c:[100]. Result: [5600,00] 
calculate a:[31] for c:[100]. Result: [6160,00] 
calculate a:[32] for c:[100]. Result: [6160,00] 
calculate a:[33] for c:[100]. Result: [6160,00] 
calculate a:[34] for c:[100]. Result: [6160,00] 
calculate a:[35] for c:[100]. Result: [6160,00] 
calculate a:[36] for c:[100]. Result: [6100,00]