我有以下方法:
public static String format_String(int hours, int minutes, int seconds)
{
if(hours > 0 && minutes > 0 && seconds > 0) return hours + " hours, " + minutes + " minutes and " + seconds + " seconds.";
else if(hours > 0 && minutes > 0 && seconds == 0) return hours + " hours and " + minutes + " minutes.";
else if(hours > 0 && minutes == 0 && seconds > 0) return hours + " hours and " + seconds + " seconds.";
else if(hours > 0 && minutes == 0 && seconds == 0) return hours + " hours.";
else if(hours == 0 && minutes > 0 && seconds > 0) return minutes + " minutes and " + seconds + " seconds.";
else if(hours == 0 && minutes > 0 && seconds == 0) return minutes + " minutes.";
else //if(hours == 0 && minutes == 0 && seconds > 0)
return seconds + " seconds.";
}
这种方法可以简化吗?
答案 0 :(得分:4)
棘手的部分是,是否将部件与" and "
或","
分开,这取决于您当前正在打印的部件右侧出现多少非零部件。其余的(打印姓名和号码)很简单。
因此,您可以通过从右到左构建字符串来减少分支数量。
public static String format_String(int hours, int minutes, int seconds)
{
StringBuilder result = new StringBuilder(".");
String sep = "", nextSep = " and ";
if (seconds > 0) {
result.insert(0, " seconds").insert(0, seconds);
sep = nextSep;
nextSep = ", ";
}
if (minutes > 0) {
result.insert(0, sep).insert(0, " minutes").insert(0, minutes);
sep = nextSep;
nextSep = ", ";
}
if (hours > 0) {
result.insert(0, sep).insert(0, " hours").insert(0, hours);
}
return result.toString();
}
或更一般地说:
public static String formatString(SortedMap<TimeUnit, Integer> parts) {
StringBuilder result = new StringBuilder(".");
String sep = "", nextSep = " and ";
for (Map.Entry<TimeUnit, Integer> e: parts.entrySet()) {
TimeUnit field = e.getKey();
Integer quantity = e.getValue();
if (quantity > 0) {
result.insert(0, sep)
.insert(0, field.toString().toLowerCase())
.insert(0, ' ')
.insert(0, quantity);
sep = nextSep;
nextSep = ", ";
}
}
return result.toString();
}
答案 1 :(得分:2)
想想你如何准备同样的句子。
if hours > 0 then say the hours
if minutes > 0 then say the minutes
if seconds > 0 then say the seconds
然后使用StringBuilder创建逻辑,最后返回一次。
答案 2 :(得分:1)
您可以使用三元运算符使其更简洁:
return
(hours > 0 && minutes > 0 && seconds > 0) ? hours + " hours, " + minutes + " minutes and " + seconds + " seconds." :
(hours > 0 && minutes > 0 && seconds == 0) ? hours + " hours and " + minutes + " minutes." :
(hours > 0 && minutes == 0 && seconds > 0) ? hours + " hours and " + seconds + " seconds." :
(hours > 0 && minutes == 0 && seconds == 0) ? hours + " hours." :
(hours == 0 && minutes > 0 && seconds > 0) ? minutes + " minutes and " + seconds + " seconds." :
(hours == 0 && minutes > 0 && seconds == 0) ? minutes + " minutes." :
seconds + " seconds.";
答案 3 :(得分:1)
这个怎么样?
public static String formatTime(int hours, int minutes, int seconds) {
List<String> parts = new ArrayList<String>(3);
if (hours > 0) parts.add(hours + " hours");
if (minutes > 0) parts.add(minutes + " minutes");
if (parts.isEmpty() || seconds > 0) parts.add(seconds + " seconds");
StringBuilder builder = new StringBuilder();
for (int i = 0; i < parts.size(); i++) {
if (i > 0) builder.append((i < parts.size() - 1) ? ", " : " and " );
builder.append(parts.get(i));
}
return builder.append(".").toString();
}
它更具可扩展性。我只是质疑它是否可以在新手到Java开发人员之间阅读。
答案 4 :(得分:0)
假设所有值总是>> = 0.代码看起来更复杂,但是比较少了很多!
if(hours > 0) { if(minutes > 0) { if(seconds > 0) return hours + " hours, " + minutes + " minutes and " + seconds + " seconds."; return hours + " hours and " + minutes + " minutes."; } if(seconds > 0) return hours + " hours and " + seconds + " seconds."; return hours + " hours."; } if(minutes > 0 ) { if(seconds > 0 ) return minutes + " minutes and " + seconds + " seconds."; return minutes + " minutes."; } return seconds + " seconds.";