2017-02-07 4 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

ええええと。 numをハッシュマップします。 12 - > 4000 18 - > 5000またはそれ以外の場合は、2つのif文(境界の場合)とマップ呼び出しが必要になります。 – DejaVuSansMono

+0

気にしない、私は方程式がそれぞれ同じものだと思ったが、そうではなかった – DejaVuSansMono

答えて

0

元のコードには不要な重複があります。このため、そのままコピーしないでください。あるいは、それをやりたいのであれば、Javaで長いブロックif-elseを使用する必要があります。これは避けたい(そしてそうすべきです)。

代わりに、私は基礎となるビジネスロジックとリファクタを適切に分析する必要があると思います。

のような何か:コードの

// 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] 
関連する問題