gpt4 book ai didi

java - 他们是否有任何简化的 Java 来查找 0000 到 9999 之间的回文日期?

转载 作者:行者123 更新时间:2023-12-01 07:16:55 24 4
gpt4 key购买 nike

import java.util.Arrays;

public class PalindromeDates {

static final int STARTINGYEAR = 0000;
static final int ENDINGYEAR = 9999;

public static void main(String[] args) {


int year, month, date;
int dateArray[];
boolean flag;

System.out.println(" Date --> Array Format\n");

for (year = STARTINGYEAR; year <= ENDINGYEAR; year++) {
for (month = 01; month <= 12; month++) {
for (date = 1; date <= 31; date++) {

if (checkValidDate(year, date, month)) {
dateArray = createDateArray(date, month, year);
flag = checkPalindrome(dateArray);
if (flag) {
System.out.print(year + "." + month + "." + date + " --> ");
System.out.println(Arrays.toString(dateArray));
}
}
}
}
}
}

public static int[] createDateArray(int date, int month, int year) { //Inserting the whole date to an array

int dateArray[] = new int[8];

dateArray[0] = year / 1000;
year = year % 1000;
dateArray[1] = year / 100;
year = year % 100;
dateArray[2] = year / 10;
dateArray[3] = year % 10;

dateArray[4] = month / 10;
dateArray[5] = month % 10;

dateArray[6] = date / 10;
dateArray[7] = date % 10;

return dateArray;
}

public static boolean checkPalindrome(int dateArray[]) {

for (int i = 0; i <= 3; i++) {
if (dateArray[i] == dateArray[7 - i]) {
} else {
return false;
}
}
return true;
}

public static boolean checkValidDate(int year, int month, int date) {

if (month == 2 && date == 30)
return false;

if ((month == 2 || month == 4 || month == 6 || month == 9 || month == 11) && (date == 31)) {
return false;
}

if ((month == 2) && (date == 29))
return (checkLeapYear(year));

return true;
}

public static boolean checkLeapYear(int year) {

if (year % 4 == 0) {
if (year % 100 == 0) {
if (year % 400 == 0)
return true;
else
return false;
} else
return true;
} else {
return false;
}
}
}

这个程序是我编写的,用于查找从 0000 到 9999 的回文日期。他们有任何简化程序可以做到这一点吗?这段代码有哪些修改?我想知道我的闰年查找代码是否正确。

有一个名为createDateArray()的方法。用于将年、月、日的整数数字放入数组中。有什么简单的方法可以做到这一点吗?

最佳答案

我从您的代码推断回文日期是格式化为 yyyyMMdd 格式的日期是回文字符串。例如,前天,2020 年 2 月 2 日,是一个回文日期,因为它被格式化为 20200202,一个回文。

Is their any simplifies program to do this? …

是的,有。见下文。

… And I want to know whether my leap year finding code is correct.

是的,这是正确的。我已将其结果与 Year.of(y).isLeap() 的结果进行了测试,y 的范围从 0 到 9999。

还有你没有问到的问题:正如 jrook 在评论中暗示的那样,要小心八进制数字。

    static final int STARTINGYEAR = 0000;

虽然这在本例中有效,但恐怕您并不完全理解其有效的原因。如果有一天您尝试使用 0500 表示第 500 年并得到 320,或者您使用 0008 表示第 8 年并收到编译时错误,您将会感到惊讶。当 Java 整数文字以 0 开头(并且后面有更多数字)时,它是八进制数,而不是十进制数字系统中的数字。因此,在您的代码中,您应该使用 0 来表示您想要打印为 0000 的年份:

    static final int STARTINGYEAR = 0;

java.time

一方面,Andreas 在另一个答案中是正确的,即使用 Java 中内置的日期类时,这会更加顺利。另一方面,该答案中使用的 Calendar 类设计不佳且早已过时。因此,我建议我们不要使用它,而是使用现代 Java 日期和时间 API java.time 提供解决方案。

    List<LocalDate> palindromeDates = Arrays.stream(Month.values())
.flatMap(m -> IntStream.rangeClosed(1, m.length(true)).mapToObj(d -> MonthDay.of(m, d)))
.map(md -> md.atYear(reverseStringToInt(md.format(monthDayFormatter))))
.sorted()
.collect(Collectors.toList());

palindromeDates.forEach(ld -> System.out.println(ld.format(dateFormatter)));

这段代码使用了一些辅助工具:

private static DateTimeFormatter monthDayFormatter = DateTimeFormatter.ofPattern("MMdd");
private static DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("uuuuMMdd");

private static int reverseStringToInt(String s) {
StringBuilder buf = new StringBuilder(s);
buf.reverse();
return Integer.parseInt(buf.toString());
}

输出摘录:

01011010
01100110
01111110
01200210

20111102
20200202
20211202

92800829
92900929

该算法思想是从 Andreas 的答案中窃取的,因为它经过深思熟虑。

链接

Oracle tutorial: Date Time解释如何使用 java.time。

关于java - 他们是否有任何简化的 Java 来查找 0000 到 9999 之间的回文日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60063146/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com