Могут ли быть упрощены эти «если заявления»? - PullRequest
3 голосов
/ 19 мая 2011

У меня есть следующий метод:

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 ]

4 голосов
/ 19 мая 2011

Сложность заключается в том, отделить ли детали с помощью " 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();
}
2 голосов
/ 19 мая 2011

Подумайте, как бы вы подготовились, чтобы СКАЗАТЬ одно и то же предложение.

if hours > 0 then say the hours
if minutes > 0 then say the minutes
if seconds > 0 then say the seconds

Затем создайте логику, используя StringBuilder с единственным возвратом в конце.

1 голос
/ 19 мая 2011

Как насчет этого?

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.

1 голос
/ 19 мая 2011

Вы можете использовать троичный оператор, чтобы сделать его немного менее многословным:

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.";
0 голосов
/ 19 мая 2011

Предполагая, что все значения всегда будут> = 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.";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...