下面的代碼編譯并完成其作業,但是假設我需要添加另外 100 個使用參考的 if 陳述句。撰寫多個 if 陳述句的最有效方法是什么?
public String getForceDetails(String ref) {
if (ref.equals("IW1")) {
setupForces();
return (ForceDetails.get(0).toString());
} else if (ref.equals("SS2")) {
setupForces();
return (ForceDetails.get(1).toString());
} else if (ref.equals("WB3")) {
setupForces();
return (ForceDetails.get(2).toString());
} else if (ref.equals("IW4")) {
setupForces();
return (ForceDetails.get(3).toString());
} else if (ref.equals("WB5")) {
setupForces();
return (ForceDetails.get(4).toString());
} else if (ref.equals("SS6")) {
setupForces();
return (ForceDetails.get(5).toString());
} else if (ref.equals("SS7")) {
setupForces();
return (ForceDetails.get(6).toString());
} else if (ref.equals("WB9")) {
setupForces();
return (ForceDetails.get(7).toString());
} else if (ref.equals("IW10")) {
setupForces();
return (ForceDetails.get(8).toString());
} else {
return "\nNo such force";
}
}
private void setupForces()
{
ForceDetails.add(new starShip("IW1","Twisters",200,200,ForceState.DOCKED,10,0,0,false));
ForceDetails.add(new starShip("SS2","Enterprise",300,200,ForceState.DOCKED,0,10,20,false));
ForceDetails.add(new starShip("WB3","Droop",300,100,ForceState.DOCKED,0,0,0,false));
ForceDetails.add(new starShip("IW4","Wingers",200,400,ForceState.DOCKED,20,0,0,false));
ForceDetails.add(new starShip("WB5","Hang",400,300,ForceState.DOCKED,0,0,0,true));
ForceDetails.add(new starShip("SS6","Voyager",450,200,ForceState.DOCKED,0,15,10,false));
ForceDetails.add(new starShip("SS7","Explorer",120, 65,ForceState.DOCKED,0,4,5,false));
ForceDetails.add(new starShip("WB9","Hover",300,400,ForceState.DOCKED,0,0,0,false));
ForceDetails.add(new starShip("IW10","Flyers",200,100,ForceState.DOCKED,5,0,0,false));
}
uj5u.com熱心網友回復:
顯而易見的選擇是在 ref 上使用 switch 陳述句:
switch (ref) {
case "IW1":
setupForces();
return (ForceDetails.get(0).toString());
break;
case "SS2":
setupForces();
return (ForceDetails.get(1).toString());
break;
// etc.
}
如果要執行的代碼始終看起來像這樣(呼叫setupForces()并獲取 的第 n 個元素ForceDetails),您還可以使用一個映射來檢索n( Map<String, Integer>),您可以使用“IW1”-> 0 等鍵值對填充它"SS2"->1 等。地圖解決方案還有一個魅力,即您不需要重復所有情況下基本相同的代碼,如果您以后必須更改它會很不方便。
uj5u.com熱心網友回復:
那么沒有內置的解決方案。您可以做的是創建一個Map 條件 -> 結果并將值回傳給鍵。
Map<String, String> mapCondToRes = new HashMap<>();
public String getForceDetails(String ref) {
setupForces();
return mapCondToRes.get(ref);
}
您可以非常輕松優雅地檢查驗證并放置更多條件。
uj5u.com熱心網友回復:
在現有代碼中,每次呼叫getForceDetails有效ref都會導致將 9 個條目添加到 starships 集合中ForceDetails。這種行為的意圖令人懷疑,可能ForceDetails隱含了延遲初始化。
接下來,擺脫if使用 map的多個陳述句肯定比轉換為switch陳述句并將相同的多個呼叫復制到setupForces(). 創建一個映射Map<String, starship>而不是串列并將其填充到其中可能是有意義的setupForces(因此不需要有一個單獨的對串列中索引的參考的映射):
Map<String, starShip> forces = new HashMap<>();
private void setupForces() {
forces.put("IW1", new starShip("IW1","Twisters",200,200,ForceState.DOCKED,10,0,0,false));
forces.put("SS2", new starShip("SS2","Enterprise",300,200,ForceState.DOCKED,0,10,20,false));
// ... add other starships mapped by their ids
}
public String getForceDetails(String ref) {
if (forces.isEmpty()) {
setupForces();
}
return Optional.ofNullable(forces.get(ref))
.map(starShip::toString)
.orElse("No such force found");
}
uj5u.com熱心網友回復:
使用java 流,您應該閱讀有關它們的資訊,稍后您會發現它在您學習 Java 時很有用。
對于下面的代碼,我假設你有getter你的“鑰匙”值你內部starShip類("IW1","SS2","WB3"...)。
此代碼還假定您無法更改當前List方法,如果可以,aMap會更好。
private static final String NO_FORCE = "\nNo such force";
public String getForceDetails(String ref) {
String result = ForceDetails.stream() // <-- It's even faster if you use `parallelStream` however is known to have non-thread-safe issues
.filter(starShipItem -> Objects.equals(starShipItem.getKey(), ref))
.map(String::valueOf).findFirst()
.orElse(NO_FORCE)
;
if (NO_FORCE.equals(result)) {
return NO_FORCE;
}
setupForces();
return result;
}
另外,我建議您看一下hackerrank 挑戰,您會在那里學到更多。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/384802.html
