Из вашего кода я делаю вывод, что дата палиндрома - это дата, которая отформатирована в формате yyyyMMdd - строка палиндрома. Например, позавчера, 2 февраля 2020 года, была дата палиндрома, потому что она отформатирована в палиндром 20200202.
Есть ли какая-нибудь упрощенная программа для этого? …
Да, есть. См. Ниже.
… И я хочу знать, верен ли мой код нахождения високосного года.
Да, это правильно. Я проверил его результат с результатом Year.of(y).isLeap()
для y
в диапазоне от 0 до 9999.
И вопрос, который вы не задавали: как подсказал джрук в комментарии, остерегайтесь восьмеричных чисел.
static final int STARTINGYEAR = 0000;
Хотя это работает в этом случае, оно работает по причинам, которые, боюсь, вы не до конца понимаете. Вы получите сюрпризы, если однажды вы попробуете 0500 для 500 года и получите 320, или вы используете 0008 для 8 года и получите ошибку времени компиляции. Когда целочисленный литерал Java начинается с 0 (и имеет больше цифр после него), это восьмеричное число, а не число в десятичной системе счисления. Таким образом, в вашем коде вы должны использовать 0
для года, который вы хотите напечатать как 0000
:
static final int STARTINGYEAR = 0;
java .time
С одной стороны Андреас прав в другой ответ, что это происходит намного проще при использовании классов даты, встроенных в Java. С другой стороны, класс Calendar
, использованный в этом ответе, плохо спроектирован и давно устарел. Поэтому я рекомендую не использовать его и вместо этого представить решение с использованием java .time, современного Java API даты и времени.
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
Идея алгоритма украдена из ответа Андреаса, поскольку он так хорошо продуман.
Ссылка
Oracle учебник: Дата и время объяснение, как использовать java .time.