压缩类似的if语句(Java)

时间:2018-07-23 06:11:44

标签: java

我试图从16中选择某个数组,具体取决于将什么值传递给类的构造函数。输入的值将在一系列if语句中使用,这些语句将选择数组。像这样

    package Model;

    import javax.swing.*;
    public class Die extends JButton{
         String letters[] = new String[6];
         public Die(int number){
               Controller con = new Controller();
               if(number==1){
                    for(int i = 0; i<5; i++}{
                        letters[i] = con.die1[i];
                    }
               }
               if(number==2){
                    for(int i = 0; i<5; i++}{
                        letters[i] = con.die2[i];
                    }
               }
               if(number==3){
                    for(int i = 0; i<5; i++}{
                        letters[i] = con.die3[i];
                    }
               }
         }
    }

(请记住,我没有检查这段代码,也没有创建全部16个if语句。)
基本上,我想以某种方式压缩这些if语句。有什么想法吗?

5 个答案:

答案 0 :(得分:4)

声明一个Map<Integer, String[]>,该数字将数字与String关联到每个die数组,并且您将没有任何条件语句。

Controller con = new Controller();
Map<Integer, String[]> map = new HashMap<>();   
map.put(1, con.die1);
map.put(2, con.die2);
map.put(3, con.die3);


if(number>=1 && number<=3){
    for(int i = 0; i<5; i++}{
        letters[i] = map.get(number)[i];
    }
}

并且按照Lino的建议,您甚至可以将此映射移到Controller类中,这在责任方面更有意义:

private Map<Integer, String[]> map = new HashMap<>();
public Controller(){
  map.put(1, die1);
  map.put(2, die2);
  map.put(3, die3);
}
public String getLetter(int number, int index){
    map.get(number)[index];
}

Die客户端现在可以是:

Controller con = new Controller();       
if(number>=1 && number<=3){
    for(int i = 0; i<5; i++}{
        letters[i] = con.getLetter(number, i);
    }
}

答案 1 :(得分:3)

最好是在if分支中仅选择应迭代的数组:

String[] array;

if(number == 1){
    array = con.die1;
} else if(number == 2){
    array = con.die2;
} else if(number == 3){
    array = con.die3;
} else {
    // throw error or select a default array
}

然后在if s之外迭代所选数组:

for(int i = 0; i<5; i++}{
     letters[i] = array[i];
}

对于将来的情况,最好分析if语句中的代码。

  1. 到处都是什么?
  2. 到处都有什么不同之处?

仅从这两点您就会看到:

  1. 您总是在遍历数组。
  2. 数组每次都不同。

因此,很容易看到仅从if语句中提取出迭代逻辑。然后选择要保留在内部的数组。

答案 2 :(得分:1)

由于所有循环都相同,因此可以在循环内移动if语句。另外,您可以将if语句更改为一个开关,或者(可能可读性较低但更短)更改一个嵌套的三元if:

带开关:

Controller con = new Controller();
for(int i=0; i<5; i++){
  switch(number){
    case 1:
      letters[i] = con.die1[i];
      break;
    case 2:
      letters[i] = con.die2[i];
      break;
    case 3:
      letters[i] = con.die3[i];
      break;
    ...
    default:
      // Do something if the number is unknown
      break;
  }
}

如果是三元,则

Controller con = new Controller();
for(int i=0; i<5; i++){
  letters[i] = number==1 ? con.die1[i]
               : number==2 ? con.die2[i]
               : number==3 ? con.die3[i]
               : ...;
}

三元if本质上是if-else的较短变体(以<condition> ? <value_if_true> : <else_value>的形式出现。以下是一个三元if的例子,也许更好理解:

int a=...;
System.out.println(a<5 ? "Less than 5" : a<15 ? "Less than 15" : "Else (15 or larger)");

这基本上与:

if(a<5){
  System.out.println("Less than 5");
} else if(a<15){
  System.out.println("Less than 15");
} else{
  System.out.println("Else (15 or larger)");
}

Try it online.

如您所见,它的可读性要差得多,因此在大多数情况下,我宁愿使用更长的if语句,但是对于您的代码,我个人将使用三进制,以使代码更紧凑而不会使代码过于复杂。

答案 3 :(得分:0)

您可以使用Arrays.copyOf中的Java API方法。

               if(number==1){
                    letters = Arrays.copyOf(con.die1, 5); 
               }
               if(number==2){
                    letters = Arrays.copyOf(con.die2, 5); 
               }
               if(number==3){
                    letters = Arrays.copyOf(con.die3, 5); 
               }

答案 4 :(得分:0)

我推荐switch statement

String[] array;

switch (number) {
        case 1:  array = con.die1;
                 break;
        case 2:  array = con.die2;
                 break;
        [...]
        case 16: array = con.die16;
                 break;
        default: // throw error or select a default array
    }