第60分钟用java时钟打印

时间:2016-02-26 03:43:50

标签: java clock

我不确定为什么会发生这种情况,但第60分钟会在第59分钟后显示在结果中,并且会在第59分钟后更改为小时。

这是我的课程和主要课程:

public class Main {
    public static void main(String[] args) {
        BoundedCounter minutes = new BoundedCounter(59);
        BoundedCounter hours = new BoundedCounter(23);

        int i = 0;
        while (i < 121) {
            System.out.println(hours + ":" + minutes);   // the current time printed
            if (minutes.getValue() >= 59) {
                hours.getValue();
                i++;
            }
        }
    }

// BoundedCounter

    public class BoundedCounter {
        private int value;
        private int upperLimit;

        public BoundedCounter(int upperLimit) {
            this.upperLimit = upperLimit;
        }

        public void next() {
            if (this.value >= this.upperLimit) {
                this.value = 0;
            } else {
                this.value++;
            }
        }

        public String toString() {
            if (this.value < 10) {
                return "" + 0 + value;
            } else {
                return "" + value;
            }
        }

        public int getValue() {
            if (this.value <= this.upperLimit) {
                return this.value++;
            } else {
                return this.value = 0;
            }
        }
    }
}

一些结果:

  

1时56   01:57   01:58   01:59   的 02:60   02:00   02:01   02:02   02:03   02:04   02:05   02:06   02:07   02:08   02:09   02:10   02:11   02:12   02:13   02:14   02:15   02:16   02:17   02:18   02:19   02:20   02:21   02:22   02:23   02:24   02:25   02:26   02:27   02:28   02:29   02:30   02:31   02:32   02:33   02:34   02:35   02:36   02:37   02:38   02:39   02:40   02:41   02:42   02:43   02:44   02:45   02:46   02:47   02:48   02:49   02:50   02:51   02:52   02:53   02:54   02:55   02:56   02:57   02:58   02:59   的 03:60   03:00   03:01   03:02   03:03   03:04   03:05

即。 2:60和3:60是意外输出

4 个答案:

答案 0 :(得分:2)

首先,你的方法正在做他们不应该做的事情。例如,getValue()应仅返回值,而不是递增值。以下是如何做到这一点:

  

Main.java

public class Main {
    public static void main(String[] args) {
        BoundedCounter minutes = new BoundedCounter(59);
        BoundedCounter hours = new BoundedCounter(23);

        int i = 0;
        while (i < 121) {
            System.out.println(hours + ":" + minutes);

            minutes.next();                 // counting minutes
            if (minutes.getValue() == 0) {  // when minutes==0, count hours
                hours.next();               // counting hours
                i++;
            }
        }
    }
}
  

BoundedCounter.java

class BoundedCounter {
    private int value;
    private int upperLimit;

    public BoundedCounter(int upperLimit) {
        this.upperLimit = upperLimit;
    }

    public void next() {
        // when reach the upperLimit, the next value should be 0
        // so >= is not needed, just == will do
        this.value = this.value == this.upperLimit ? 0 : this.value+1;
    }

    public String toString() {
        // using smarter approach to pad with zeros :)
        return String.format("%02d", value);
    }

    public int getValue() {
        // this method should only return the value, not change it in any way
        return this.value;
    }
}

一些输出:

  

00:00 00:01 00:02 00:03 00:04 00:05 00:06 00:07 00:08 00:09 00:10   00:11 00:12 00:13 00:14 00:15 00:16 00:17 00:18 00:19 00:20 00:21   00:22 00:23 00:24 00:25 00:26 00:27 00:28 00:29 00:30 00:31 00:32   00:33 00:34 00:35 00:36 00:37 00:38 00:39 00:40 00:41 00:42 00:43   00:44 00:45 00:46 00:47 00:48 00:49 00:50 00:51 00:52 00:53 00:54   00:55 00:56 00:57 00:58 00:59 01:00 01:01 01:02 01:03 01:04 01:05   01:06 01:07 01:08 01:09 01:10 01:11 01:12 01:13 01:14 01:15 01:16   01:17 01:18 01:19 01:20 01:21 01:22 01:23 01:24 01:25 01:26 01:27   01:28 01:29 01:30 01:31 01:32 01:33 01:34 01:35 01:36 01:37 01:38   01:39 01:40 01:41 01:42 01:43 01:44 01:45 01:46 01:47 01:48 01:49   01:50 01:51 01:52 01:53 01:54 01:55 01:56 01:57 01:58 01:59 02:00   02:01

答案 1 :(得分:1)

您应该更改以下行:

if (this.value <= this.upperLimit) {
    return this.value++;

if (++this.value <= this.upperLimit) {
    return this.value;

if (minutes.getValue() >= 59) {

if (minutes.getValue() == 0) {

问题在于,当代码中的分钟值为59时,它仍然是<= 59,因此它进入if块。然后你将59返回给用户,分钟现在是60.

因此,在下一次迭代中,首先打印60,然后然后调用getValue()方法,将分钟调整为0.

我猜你在小时变为24时遇到同样的问题......

除此之外,请考虑遵循更多&#34;预期&#34;您的方法的功能,基于它们的名称,这使得它们清楚地表明了它们的作用,即使您进行调试也变得更加容易。例如,请参阅Shadowfax's answer

答案 2 :(得分:0)

您没有显示实际增加小时数或分钟数的任何部分,但这似乎是您的getValue调用中的问题。

public int getValue() {
    if (this.value <= this.upperLimit) {
        return this.value++;
    } else {
        return this.value = 0;
    }
}

this.value++;部分将值增加到60,并且不会将其翻转。

答案 3 :(得分:0)

您创建BoundedCounter的方法存在一些问题 当你的方法名称只是想要读它时,你不应该改变你的计数器值。第二个你所有的条件检查重置应该只在你的BoundedCounter类中发生。如果你想重置你的计数器只是暴露另一种方法来做到这一点。 / p>

以下是供您参考的工作解决方案

import java.util.*;

public class Test{

    public static void main(String[] args){
        BoundedCounter minutes = new BoundedCounter(59);
        BoundedCounter hours = new BoundedCounter(23);
        int i = 0;
        while (i < 121) {
            if (minutes.hasNext()) {
                minutes.next();
            } else {
                hours.next();
                minutes.resetTo(0);
            }
            System.out.println(hours + ":" + minutes);
            i++;
        }
    }
}

class BoundedCounter {
    private int value;
    private int upperLimit;

    public BoundedCounter(int upperLimit) {
        this.upperLimit = upperLimit;
    }

    public void next() {
        ++this.value;
    }

    public boolean hasNext() {
        return this.value < this.upperLimit;
    }

    public void resetTo(int resetValue) {
        this.value = resetValue;
    }

    public int getValue() {
        if (this.hasNext()) {
            return this.value;
        }
        return 0;
    }

    public String toString() {
        if (this.value < 10) {
            return "" + 0 + value;
        } else {
            return "" + value;
        }
    }

}