2017-06-16 20 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); 
}