优雅的方式来取代开关结构

时间:2012-12-20 13:40:28

标签: java if-statement switch-statement

我生成了简单的随机数,我想根据生成的值执行不同的操作。我有9个不同的动作。我无法在switch值上使用double结构,我无法从double投射到int以使用switch因此我注定要使用{ {1}}结构?

if

编辑:请注意我的行为不是等概率的

5 个答案:

答案 0 :(得分:2)

创建一个static TreeMap<Double,Integer>,其间隔限制映射到整数“案例标签”。使用higerEntry方法获取与您随机生成的double最近的值的条目,并使用switch语句中的结果值。

static final TreeMap<Double,Integer> limits = new TreeMap<Double,Integer>();
static {
    limits.put(1.0, 0);
    limits.put(3.5, 1);
    limits.put(8.0, 2);
    limits.put(10.3, 3);
}

此地图设置了五个间隔:

  • -inf..1.0
  • 1.0..3.5
  • 3.5..8.0
  • 8.0..10.3
  • 10.3 .. + INF

现在,您可以在代码中执行此操作:

double someNumber = ... // Obtain a random double
Map<Double,Integer> entry = higerEntry(someNumber);
switch (entry.getValue()) {
    case 0: ... break;
    case 1: ... break;
    case 2: ... break;
    case 3: ... break;
    default: ... break;
}

答案 1 :(得分:1)

在这里,一些代码:

    switch ((int) (rand * 10)) {
    case 0:
    case 1:
    case 2:
    case 3:
        System.out.println("Between 0 and 3");
        break;
    case 4:
        System.out.println("4");
        break;
    case 5:
        System.out.println("5");
        break;
    case 6:
        System.out.println("6");
        break;
    default:
        System.out.println("More then 6");
        break;
    }

答案 2 :(得分:0)

如果操作是等概率的,您可以使用Random.nextInt()上限和switch

      Random rand = new Random();
      ...
      switch (rand.nextInt(10)) {
      case 0: ...; break;
      case 1: ...; break;
      case 9: ...; break;
      }

您可以使用与[0, 1)浮点随机数相同的技术。只需将其乘以10并投放到int

答案 3 :(得分:0)

好的,感谢您的回答和@dasblinkenlight,我找到了解决问题的自定义解决方案:

static final Map<Integer, Double> cases = new HashMap<Integer, Double>(9);

static{             
    cases.put(1, 30.0);
    cases.put(2, 55.0);     
    cases.put(3, 70.0);     
    cases.put(4, 80.0);     
    cases.put(5, 84.0);     
    cases.put(6, 88.0);     
    cases.put(7, 92.0);     
    cases.put(8, 96.0);     
    cases.put(9, 100.0);
}

switch (getIntFromDouble(Math.random()*100)) {
    case 0 : ...
        break;

    case 1 : ...
        break;

    ...     

    case 9 : ...
        break;

}

private int getIntFromDouble(double rand){

    for(Map.Entry<Integer, Double> entry : cases.entrySet()){
        if(rand <= entry.getValue())
            return entry.getKey();
    }

    return Integer.MAX_VALUE;
}

答案 4 :(得分:-1)

你不能使用四舍五入吗?

int value=Math.round(yourDouble)