Как moveForward (lostTime) должен давать правильный вывод, когда переменные часа и минуты опускаются ниже нуля? - PullRequest
0 голосов
/ 07 мая 2018

Я знал способ отсрочки по минутам, например, с 22:50 до 2:10. Я вставил 200 в параметр метода задержки, я обеспокоен тем, что метод перемещения времени вперед не работает, поскольку я попытался установить время 1:20 и переместить 100 минут (1 час и 40 минут) вперед к 23:40. , Когда я попытался запустить код, вывод отображался 1:40 после перемещения времени вперед. Какая строка была неправильной в методе moveForward (int lostMinute)?

class Time
{
    private int hour; // between 0 - 23
    private int minute; // between 0 - 59
    public Time()
    {
        this(0, 0);
    }
    public Time(int hr, int min)
    {
        hour = (hr >= 0 && hr < 24) ? hr : 0;
        minute = (min >= 0 && min < 60) ? min : 0;
    }
    public int getHour()
    {
        return hour;
    }
    public int getMinute()
    {
        return minute;
    }
    public void setHour(int hour)
    {
        this.hour = (hour >= 0 && hour < 24) ? hour : 0;
    public void setMinute(int minute)
    {
        this.minute = (minute >= 0 && minute < 60) ? minute : 0;
    }
    public String toString()
    {
        return String.format("%02d:%02d", hour, minute);
    }
    public void delay(int newMinute)
    {
        minute = minute + newMinute;
        if(minute >= 60)
        {
            // (minute / 60) is an integer division and truncates the remainder, which refers to (minute % 60)
            hour = hour + (minute / 60);
            minute = minute % 60;
            if(hour >= 24)
            {
                hour = hour % 24;
            }
        }
    }
    public void moveForward(int lostMinute)
    {
        if(minute < lostMinute)
        {
            hour = hour - ((60 + minute) / 60);
            minute = (minute + 60) % 60;
            if(hour < 0)
            {
                hour = (24 + hour) % 24;
            }
        }
        else
        {
            minute = minute - lostMinute;
        }
    }
}

Я видел, что delay () работает правильно, а moveForward () - нет. Чтобы сделать нотацию времени более понятной для сортировки, я использовал String.format("%02d:%02d"), чтобы указать время между 00:00 и 23:59. Обратите внимание, что я не использую import java.util.Calender; или 'import java.util.Date; потому что часть моего проекта состоит в сортировке массива по часам, а затем по минутам. Например, если мы пытаемся создать проект автобусного терминала, мы предполагаем, что дата и календарь не имеют значения в расписании.

public class MainTime
{
    public static void main(String[] args)
    {
        Time t1 = new Time(23:50);
        Time t2 = new Time(1:20);
        Time t3 = new Time(4:50);
        Time t4 = new Time(18:30);
        Time t5 = new Time(14:15);
        t1.delay(200);
        t2.moveForward(100);
        t3.delay(100);
        t4.moveForward(20);
        t5.moveForward(160);
        System.out.println(t1.toString());
        System.out.println(t2.toString());
        System.out.println(t3.toString());
        System.out.println(t4.toString());
        System.out.println(t5.toString());
    }
}

Ограничения: когда изменение времени больше минуты в параметре и когда час приближается к нулю. Когда я запускал код в NetBeans, у t1 было 2:10, когда я добавил 200 в 23:50 в методе delay(newMinute); У t2 было 1:40, когда я вычитал 100 из 1:20 в moveForward(lostMinute) методе; t3 было 6:30, когда я добавил 100 в 4:50 в delay(newMinute); t4 имел 18:10, когда я вычитал 20 из 18:30 в moveForward(lostMinute); t5 имел 14: -25, когда я вычел 160 из 14:15 в moveForward(lostMinute). Переменные t2 и t5 после выполнения на самом деле должны быть 23:40 и 11:35 соответственно. Пожалуйста, определите, какие строки в public void moveForward(int lostMinute) дают неправильный вывод после вычитания минут из заданного времени. В случае, если минута обнуляется, 60 и запись по модулю % может быть полезна; в случае, если время обнуляется, 24 и модульная запись % могут быть полезны. Я надеюсь, что moveForward(lostMinute) будет хорошо работать в тех случаях, когда minute < 0 и когда hour < 0.

1 Ответ

0 голосов
/ 07 мая 2018

java.time

    LocalTime t1 = LocalTime.of(23, 50);
    t1 = t1.plusMinutes(200);
    System.out.println(t1.toString()); // 03:10

    LocalTime t2 = LocalTime.of(1, 20);
    t2 = t2.minusMinutes(100);
    System.out.println(t2.toString()); // 23:40

    LocalTime t3 = LocalTime.of(4, 50);
    t3 = t3.plusMinutes(100);
    System.out.println(t3.toString()); // 06:30

    LocalTime t4 = LocalTime.of(18, 30);
    t4 = t4.minusMinutes(20);
    System.out.println(t4.toString()); // 18:10

    LocalTime t5 = LocalTime.of(14, 15);
    t5 = t5.minusMinutes(160);
    System.out.println(t5.toString()); // 11:35

Вывод дан в виде комментариев. Я думаю, что это то, что вы хотели. Так что не изобретай велосипед. Вместо использования собственного Time класса используйте LocalTime. Он предназначен для использования вами, он был разработан и протестирован для вас. LocalTime - это время суток в интервале с 00:00 до 23: 59: 59.999999999. За исключением того, что он включает секунды и доли секунды, он совпадает с вашим интервалом. Если вы никогда не установите для секунд значение, отличное от 0, они не будут напечатаны методом toString. Также LocalTime реализует Comparable, поэтому сортировка проста.

Имейте в виду, что объект LocalTime является неизменным, поэтому вместо методов-мутаторов у него есть методы, которые возвращают новый объект LocalTime с новым значением. Это уже продемонстрировано с plusMinutes и minusMinutes выше. Также вместо myLocalTime.setHour(17); вам нужно myLocalTime = myLocalTime.withHour(17); и т. Д.

Что пошло не так в вашем коде?

Ваш метод moveForward, по-видимому, правильно обрабатывает час в случае, если он должен быть перенесен на предыдущий час, например, с 14:05 до 13:55 или с 14: С 55 до 13:05. В этом случае вы никогда не вычитаете lostMinutes, что я думаю, вы должны как-то. Если minute равно 0–59, то ((60 + minute) / 60) всегда будет 1, поэтому вы всегда вычитаете ровно 1 час, а не 2 и более.

Обычно ожидаемые диапазоны аргументов как delay, так и moveForward неясны. Я думаю, что они должны были быть задокументированы, а аргументы проверены на соответствие задокументированным ограничениям.

Link

Обучающее руководство по Oracle: Дата и время , объясняющее, как использовать java.time.

...