Java — 如何找到包含小时、分钟和秒的数字时钟的所有有效组合?
Java — How to find all valid combinations for a digital clock with hours, minutes and seconds?
我需要用数字时钟的所有可能组合(但仅作为 HHMMSS 而不是 HH:MM:SS)填充 Java 中的字符串数组,如下所示:
000000 000001 010000 235903
无效的是:
240000 000160 006000
等等。
有没有比将数字从 0 到 999.999 转换为格式正确的字符串(从 000000 到 999999)并删除所有无效字符串更简单的方法?
我试图避免的这种嵌套循环解决方案:
String[] arr = new String[24 * 60 * 60];
int index = 0;
for (int hours = 0; hours < 24; hours++) {
for (int minutes = 0; minutes < 60; minutes++) {
for (int seconds = 0; seconds < 60; seconds++) {
arr[index] = String.format("%02d%02d%02d", hours, minutes, seconds);
index++;
}
}
}
嵌套循环
你知道有 twenty-four 小时,从 0 到 23。
你知道有 60 分钟的可能,从 0 到 59。
还有 60 秒,如果我们忽略 Leap Second,0 到 59。
你可以设置嵌套的 for
循环吗?通常,我们经常在每个循环中使用这些单个字符作为计数器的名称:i
、j
和 k
。但在你的情况下,我世界使用 hour
、minute
、second
.
的名称
要最有效地构建文本,请使用 StringBuilder
对象。
我不会展示实际的代码来为您保留完成作业的乐趣。
使用 java.time
包:
var formatter = DateTimeFormatter.ofPattern("HHmmss");
var hms = new String[24 * 60 * 60];
for (var i = 0; i < hms.length; i++) {
hms[i] = formatter.format(LocalTime.ofSecondOfDay(i));
}
三个嵌套循环:
var hms = new String[24 * 60 * 60];
var index = 0;
for (var h = 0; h < 24; h++) {
for (var m = 0; m < 60; m++) {
for (var s = 0; s < 60; s++) {
hms[index++] = String.format("%02d%02d%02d", h, m, s);
}
}
}
单循环,使用format
以毫秒为单位格式化时间(不太确定是否推荐):
var hms = new String[24 * 60 * 60];
for (var i = 0; i < hms.length; i++) {
hms[i] = String.format("%TH%1$TM%1$TS", i * 1000L);
}
完全没有循环:
java.util.stream.LongStream.
range(0, 24 * 60 * 60).
mapToObj(x -> java.time.LocalTime.ofSecondOfDay(x)).
collect(java.util.stream.Collectors.toList()).
forEach(x -> System.out.println(x.format(java.time.format.DateTimeFormatter.ofPattern("HHmmss"))));
我需要用数字时钟的所有可能组合(但仅作为 HHMMSS 而不是 HH:MM:SS)填充 Java 中的字符串数组,如下所示:
000000 000001 010000 235903
无效的是:
240000 000160 006000
等等。
有没有比将数字从 0 到 999.999 转换为格式正确的字符串(从 000000 到 999999)并删除所有无效字符串更简单的方法?
我试图避免的这种嵌套循环解决方案:
String[] arr = new String[24 * 60 * 60];
int index = 0;
for (int hours = 0; hours < 24; hours++) {
for (int minutes = 0; minutes < 60; minutes++) {
for (int seconds = 0; seconds < 60; seconds++) {
arr[index] = String.format("%02d%02d%02d", hours, minutes, seconds);
index++;
}
}
}
嵌套循环
你知道有 twenty-four 小时,从 0 到 23。
你知道有 60 分钟的可能,从 0 到 59。
还有 60 秒,如果我们忽略 Leap Second,0 到 59。
你可以设置嵌套的 for
循环吗?通常,我们经常在每个循环中使用这些单个字符作为计数器的名称:i
、j
和 k
。但在你的情况下,我世界使用 hour
、minute
、second
.
要最有效地构建文本,请使用 StringBuilder
对象。
我不会展示实际的代码来为您保留完成作业的乐趣。
使用 java.time
包:
var formatter = DateTimeFormatter.ofPattern("HHmmss");
var hms = new String[24 * 60 * 60];
for (var i = 0; i < hms.length; i++) {
hms[i] = formatter.format(LocalTime.ofSecondOfDay(i));
}
三个嵌套循环:
var hms = new String[24 * 60 * 60];
var index = 0;
for (var h = 0; h < 24; h++) {
for (var m = 0; m < 60; m++) {
for (var s = 0; s < 60; s++) {
hms[index++] = String.format("%02d%02d%02d", h, m, s);
}
}
}
单循环,使用format
以毫秒为单位格式化时间(不太确定是否推荐):
var hms = new String[24 * 60 * 60];
for (var i = 0; i < hms.length; i++) {
hms[i] = String.format("%TH%1$TM%1$TS", i * 1000L);
}
完全没有循环:
java.util.stream.LongStream.
range(0, 24 * 60 * 60).
mapToObj(x -> java.time.LocalTime.ofSecondOfDay(x)).
collect(java.util.stream.Collectors.toList()).
forEach(x -> System.out.println(x.format(java.time.format.DateTimeFormatter.ofPattern("HHmmss"))));