我试图从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语句。有什么想法吗?
答案 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语句中的代码。
仅从这两点您就会看到:
因此,很容易看到仅从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)");
}
如您所见,它的可读性要差得多,因此在大多数情况下,我宁愿使用更长的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
}