java 时钟打印的第 60 分钟
60th minute printed in java clock
我不确定为什么会出现这种情况,但是结果中打印了第 60 分钟,而在第 59 分钟后应该更改为小时。
这是我的 class 和主程序:
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++;
}
}
}
//有界计数器
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;
}
}
}
}
一些结果:
01: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 是意外输出
您应该更改行:
if (this.value <= this.upperLimit) {
return this.value++;
到
if (++this.value <= this.upperLimit) {
return this.value;
AND
if (minutes.getValue() >= 59) {
到
if (minutes.getValue() == 0) {
问题是,当您的代码中的分钟值为 59 时,它仍然 <= 59,因此它进入了 if 块。然后你 return 59 给用户,现在分钟数是 60。
因此,在下一次迭代中,您首先打印 60,然后 然后 您调用 getValue()
方法,这会将您的分钟数变为 0。
我猜你在 24 小时遇到了同样的问题...
除此之外,请考虑根据方法的名称遵循更多 "expected" 的功能,这样可以清楚地说明它们的作用并且变得更容易,甚至对您来说调试也是如此。例如,参见 。
您没有显示实际增加您的小时数或分钟数的任何部分,但这似乎是您的 getValue 调用中的问题。
public int getValue() {
if (this.value <= this.upperLimit) {
return this.value++;
} else {
return this.value = 0;
}
}
this.value++;
部分将值增加到 60,并且不会滚动。
您创建 BoundedCounter 的方法存在一个小问题
当你的方法名称说你只想读取时你不应该改变你的计数器值 it.Second 你所有的重置条件检查应该发生在你的 BoundedCounter class only.If 你只想重置你的计数器公开另一种方法来做到这一点。
这里有可行的解决方案供大家参考
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;
}
}
}
首先,您的方法正在做它们不应该做的事情。例如,getValue()
应该只 return 值,而不是增加它。这是如何做到的:
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
我不确定为什么会出现这种情况,但是结果中打印了第 60 分钟,而在第 59 分钟后应该更改为小时。
这是我的 class 和主程序:
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++;
}
}
}
//有界计数器
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;
}
}
}
}
一些结果:
01: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 是意外输出
您应该更改行:
if (this.value <= this.upperLimit) {
return this.value++;
到
if (++this.value <= this.upperLimit) {
return this.value;
AND
if (minutes.getValue() >= 59) {
到
if (minutes.getValue() == 0) {
问题是,当您的代码中的分钟值为 59 时,它仍然 <= 59,因此它进入了 if 块。然后你 return 59 给用户,现在分钟数是 60。
因此,在下一次迭代中,您首先打印 60,然后 然后 您调用 getValue()
方法,这会将您的分钟数变为 0。
我猜你在 24 小时遇到了同样的问题...
除此之外,请考虑根据方法的名称遵循更多 "expected" 的功能,这样可以清楚地说明它们的作用并且变得更容易,甚至对您来说调试也是如此。例如,参见
您没有显示实际增加您的小时数或分钟数的任何部分,但这似乎是您的 getValue 调用中的问题。
public int getValue() {
if (this.value <= this.upperLimit) {
return this.value++;
} else {
return this.value = 0;
}
}
this.value++;
部分将值增加到 60,并且不会滚动。
您创建 BoundedCounter 的方法存在一个小问题 当你的方法名称说你只想读取时你不应该改变你的计数器值 it.Second 你所有的重置条件检查应该发生在你的 BoundedCounter class only.If 你只想重置你的计数器公开另一种方法来做到这一点。
这里有可行的解决方案供大家参考
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;
}
}
}
首先,您的方法正在做它们不应该做的事情。例如,getValue()
应该只 return 值,而不是增加它。这是如何做到的:
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