所以我在代码的第6行中对if语句的逻辑进行了很多考虑。但我希望从更有经验的开发人员那里得到一些反馈。你们认为我的代码过于复杂吗?如果是这样,你们怎么会写得更简洁?
答案 0 :(得分:8)
过于复杂?是的,你真的是: - )
我只是使用更简单的方法:
public String seeColor (String color) {
if (color.startsWith("red")) return "red";
if (color.startsWith("blue")) return "blue";
return "";
}
以下完整程序显示了它的实际效果:
public class Test
{
public static String seeColor (String color) {
if (color.startsWith("red")) return "red";
if (color.startsWith("blue")) return "blue";
return "";
}
public static void main(String[] args) {
String[] testData = { "redxx", "xxred", "blueTimes", "NoColor",
"red", "re", "blu", "blue", "a", "", "xyzred" };
for (String s: testData)
System.out.println("[" + s + "] -> [" + seeColor(s) + "]");
}
}
该程序的输出正如预期的那样:
[redxx] -> [red]
[xxred] -> []
[blueTimes] -> [blue]
[NoColor] -> []
[red] -> [red]
[re] -> []
[blu] -> []
[blue] -> [blue]
[a] -> []
[] -> []
[xyzred] -> []
如果您希望以后可以轻松扩展,可以选择以下内容:
public static String seeColor (String color) {
String[] allow = {"red", "blue"};
for (String s: allow)
if (color.startsWith(s))
return s;
return "";
}
然后,向allow
数组添加颜色是您需要识别它的唯一步骤。
答案 1 :(得分:2)
在我看来,你最好将你的颜色名称封装在一个流中,以便它可以轻松扩展而不必添加新的if分支:
return Stream.of("red", "blue", "green")
.filter(colourName::startsWith).findAny().orElse("");
请注意,此解决方案依赖于Java 8流和方法引用。
答案 2 :(得分:0)
就个人而言,我认为你可以用
之类的东西来简化它if (str != null) {
if (str.equals("red")) return "red";
else if (str.equals("blue")) return "blue";
}
return "";
或略微复杂的switch
if (str != null) {
switch (str) {
case "red":
return "red";
case "blue";
return "blue";
}
}
return "";
测试length
然后执行substring()
似乎执行了大量相对昂贵的String
操作,对我没用。
修改强>
如果您只需要测试起始字符,我希望
if (str != null) {
if (str.startsWith("red")) return "red";
else if (str.startsWith("blue")) return "blue";
}
return "";
答案 3 :(得分:0)
正则表达式解决方案。 ^
表示匹配字符串的开头。
public static String GetColor(String input) {
String[] colors = {"red", "blue"};
for(String color : colors) {
if(input.matches(String.format("^%s.*", color)))
return color;
}
return "";
}