2017-06-16 23 views
1

如何簡化此代碼?我懷疑在我的函數中有兩個switch語句。如何簡化我的java代碼功能?

private String getKeyword(String id) { 
    String keyword = ""; 
    switch (id.substring(1, 2)) { 
     case "E": 
      keyword = "英語"; 
      break; 
     case "M": 
      keyword = "數學"; 
      break; 
     case "W": 
      keyword = "統合"; 
      break; 
    } 
    switch (id.substring(4,5)){ 
     case "W": 
      keyword = "統合"; 
      break; 
    } 
    return keyword; 
} 
+0

這問題在這裏脫離主題。您可以在https://codereview.stackexchange.com/上提出這樣的問題。 – jAC

+2

帶有一個案例的switch語句沒有意義。你可以做'if(id.substring(4,5).equals(「W」)){keyword =「統合」; }' –

+0

如果您只想將子字符串映射到關鍵字,則可以使用「Map」(令人驚訝的名稱;-))。看看[集合教程章節地圖界面](https://docs.oracle.com/javase/tutorial/collections/interfaces/map.html)。 – SubOptimal

回答

1
private String getKeyword(String id) { 
    String keyword = ""; 
    switch (id.substring(1, 2)) { 
     case "E": 
      keyword = "英語"; 
      break; 
     case "M": 
      keyword = "數學"; 
      break; 
     case "W": 
      keyword = "統合"; 
      break; 
    } 
    if ("W".equals(id.substring(4, 5))) keyword = "統合"; 
    return keyword; 
} 
0

您可以在單獨的功能中移動開關主體。

如果你希望縮短,你也可以在案例中刪除中斷並立即返回。

你也可以使用枚舉

你的一個開關,可以通過一個簡單的if語句來代替。

private String getKeyword(String id) 
{ 
    if(id.substring(4,5).equals("W")) 
    { 
     return "統合"; 
    } 
    else 
    { 
     switch (id.substring(1, 2)) { 
      case "E": 
       return "英語"; 
      case "M": 
       return "數學"; 
       break; 
      case "W": 
       return "統合"; 
     } 
    } 

    return ""; 
} 
1

您可以使用枚舉。 每個人都會包含一個或多個ID和相應的關鍵字:更易於閱讀和維護。 最後,在Enumeration中聲明一個靜態方法,根據提供的id檢索預期的元素。

2

您可以只使用if else if聲明。
這將不那麼冗長。

此外,前一個和最後一個條件有相似之處。
所以你可以把它們和一個OR運算符合併成一個語句。
兩者都返回"統合"

最後,您可以直接返回值而不是在每個匹配的情況下對局部變量賦值。
但是,隨着第二個switch語句覆蓋要返回的值,您應該將其作爲要測試的第一個條件移動它。
它會讓事情變得更加清晰:

private String getKeyword(String id) { 

    char c = id.substring(1, 2).charAt(0); 

    if (c == 'W' || id.substring(4,5).charAt(0) == 'W'){ 
     return "統合"; 
    } 
    else if (c == 'E'){ 
     return "英語"; 
    } 
    else if (c == 'M'){ 
     return "數學"; 
    }      

    return ""; 
} 
+1

你應該在'id =「xExxW」'時返回'「統合」'。 – saka1029

+0

@ saka1029良好的捕獲。非常感謝。我隨即更新。 – davidxxx

1

您可以製作一個關鍵字映射並使用它。由於這是靜態的,因此可以將此映射作爲實例變量,並在調用該方法時使用它。

//do this in something like a constructor 
Map<String, String> keywordMap = new HashMap<>; 
keywordMap.put("E", "英語"); 
//more put calls 

//and in your method, you'll only need 
return keywordMap.get(id.substring(1, 2)); 

注意使用兩個switch實施的邏輯。由於第一個開關中的匹配不會導致方法返回,因此第二個開關中的匹配可以覆蓋關鍵字變量。

1

使用地圖:

private static final Map<String, String> letterToKeyword = 
    Map.of("E", "英語", "M", "數學", "W", "統合"); 

private String getKeyword(String id) { 
    if (id.substring(4,5).equals("W")) return "統合"; 
    return letterToKeyword.getOrDefault(id.substring(1, 2), ""); 
} 

此前的Java 9號樓地圖會稍微更詳細的(但可以用一個輔助方法來協助,如果需要的話):

private static final Map<String, String> letterToKeyword; 

static { 
    Map<String, String> map = new HashMap<>(); 
    map.put("E", "英語"); 
    map.put("M", "數學"); 
    map.put("W", "統合"); 
    letterToKeyword = Collections.unmodifiableMap(map); 
}