[英]How to Improve a repetitive Code
我正在嘗試以3種顏色組合打開和關閉20個燈的設置
組合變成紅色綠色白色
RGW RGW RGW RGW RGW RGW RG
目前,我已經為重復序列進行了硬編碼,但是想知道如何改進它。 (PS開始學習JAVA的旅程)。
我想知道為了縮短這段代碼我可以學習使用什么方法或實踐。
if ( Num == 1){
System.out.println("RED is On");//1
TimeUnit.MILLISECONDS.sleep(500);
System.out.println("Red is Off");
System.out.println("Green is On");//2
TimeUnit.MILLISECONDS.sleep(500);
System.out.println("Green is Off");
System.out.println("White is On");//3
TimeUnit.MILLISECONDS.sleep(500);
System.out.println("White is OFF");
System.out.println("RED is On");//4
TimeUnit.MILLISECONDS.sleep(500);
System.out.println("Red is Off");
System.out.println("Green is On");//5
TimeUnit.MILLISECONDS.sleep(500);
System.out.println("Green is Off");
System.out.println("White is On");//6
TimeUnit.MILLISECONDS.sleep(500);
System.out.println("White is OFF");
System.out.println("RED is On");//7
TimeUnit.MILLISECONDS.sleep(500);
System.out.println("Red is Off");
System.out.println("Green is On");//8
TimeUnit.MILLISECONDS.sleep(500);
System.out.println("Green is Off");
System.out.println("White is On");//9
TimeUnit.MILLISECONDS.sleep(500);
System.out.println("White is OFF");
System.out.println("RED is On");//10
TimeUnit.MILLISECONDS.sleep(500);
System.out.println("Red is Off");
System.out.println("Green is On");//11
TimeUnit.MILLISECONDS.sleep(500);
System.out.println("Green is Off");
System.out.println("White is On");//12
TimeUnit.MILLISECONDS.sleep(500);
System.out.println("White is OFF");
System.out.println("RED is On");//13
TimeUnit.MILLISECONDS.sleep(500);
System.out.println("Red is Off");
System.out.println("Green is On");//14
TimeUnit.MILLISECONDS.sleep(500);
System.out.println("Green is Off");
System.out.println("White is On");//15
TimeUnit.MILLISECONDS.sleep(500);
System.out.println("White is OFF");
System.out.println("RED is On");//16
TimeUnit.MILLISECONDS.sleep(500);
System.out.println("Red is Off");
System.out.println("Green is On");//17
TimeUnit.MILLISECONDS.sleep(500);
System.out.println("Green is Off");
System.out.println("White is On");//18
TimeUnit.MILLISECONDS.sleep(500);
System.out.println("White is OFF");
System.out.println("RED is On");//19
TimeUnit.MILLISECONDS.sleep(500);
System.out.println("Red is Off");
System.out.println("Green is On");//20
TimeUnit.MILLISECONDS.sleep(500);
System.out.println("Green is Off");
}
這是在無限循環中執行此操作的眾多可能性之一:
String[] color = new String[]{"Red", "Green", "White"};
int counter = 0;
while (true) {
System.out.println(color[counter] + " is On");
TimeUnit.MILLISECONDS.sleep(500);
System.out.println(color[counter] + " is Off");
counter++;
if (counter > 2) {
counter = 0;
}
}
這里有兩種重復性:
(1)的解決方案是將重復的代碼提取到一個方法中,並將更改的元素作為參數傳入:
private void flash(String color) {
System.out.println(color + " is On");
TimeUnit.MILLISECONDS.sleep(500);
System.out.println(color + " is Off");
}
然后根據需要調用它:
flash("Green");
flash("RED");
flash("White");
// etc.
(2)的解決方案是使用循環來表達重復。
您的代碼似乎重復紅綠白,因此您可以在for
循環中調用flash()
:
for(int i=0; i<5; i++) { // 5 picked arbitrarily
flash("RED");
flash("Green");
flash("White");
}
您甚至可以將循環放入循環中:
List<String> colors = Arrays.asList("RED", "Green", White");
for(int i=0; i<5; i++) { // 5 picked arbitrarily
for(String color : colors) {
flash(color);
}
}
您可以將字符串“ colors”作為參數傳遞給blinker(),以使其可重用。 根據代碼頂部的條件,我假設您將有多個模式可以閃爍。 在這種情況下,請為每個模式定義一個單獨的字符串“ colors”,並在請求該模式后將其饋送到blinker()。 您的代碼既可讀又易於維護。
public void blinker() {
String colors = "GWB GWB GWB GW GW GWWWW GWBB BWG";
for (char c : colors.toCharArray()) {
String colorName;
switch (c) {
case 'G':
colorName = "GREEN";
break;
case 'W':
colorName = "WHITE";
break;
case 'B':
colorName = "BLUE";
break;
case ' ':
continue;
default:
System.err.println("Unknown color: " + c);
continue;
}
try {
doBlink(colorName, 500);
} catch (Exception ignore) {}
}
}
public void doBlink(String color, long duration) throws InterruptedException {
System.out.println(String.format("%s is On", color));
TimeUnit.MILLISECONDS.sleep(duration);
System.out.println(String.format("%s is Off", color));
}
輸出看起來像:
GREEN is On
GREEN is Off
WHITE is On
WHITE is Off
BLUE is On
BLUE is Off
GREEN is On
...
只是添加一個:
import java.util.concurrent.TimeUnit;
import java.util.stream.IntStream;
public class Test{
public static void main(String [] args){
IntStream.rangeClosed(1, 20).forEach(i->{
try {
onOff(i);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
});
}
private static void onOff(int i) throws InterruptedException {
String color = getColor(i);
System.out.println(color+" is On");
TimeUnit.MILLISECONDS.sleep(500);
System.out.println(color+" is Off");
}
private static String getColor(int i) {
return i%3 == 1? "RED": i%3 == 2? "Green" : "White";
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.