簡體   English   中英

壓縮類似的if語句(Java)

[英]Compressing Similar if Statements (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語句。 有任何想法嗎?

聲明一個Map<Integer, String[]> ,該數字將數字與每個die數組的String關聯,並且您將沒有任何條件語句。

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);
    }
}

最好的方法是在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之外的選定數組:

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

對於將來的情況,最好分析if語句中的代碼。

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

僅從這兩點您將看到:

  1. 您總是在遍歷數組。
  2. 每次陣列都不同。

因此,很容易看到僅從if語句中提取出迭代邏輯。 並且將選擇的數組留在里面。

由於所有循環都相同,因此可以在循環內移動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 <condition> ? <value_if_true> : <else_value>上是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)");
}

在線嘗試。

如您所見,它的可讀性要差得多,因此在大多數情況下,我寧願使用更長的if語句,但是對於您的代碼,我個人將使用三進制if來使代碼更緊湊而不會使代碼變得過於復雜。

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

               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); 
               }

我建議使用switch語句

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
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM