这些“if语句”可以简化吗?

时间:2011-05-19 19:27:27

标签: java string

我有以下方法:

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.";
}

这种方法可以简化吗?

5 个答案:

答案 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.";