Средство поиска даты на палиндроме работает неправильно (Java) - PullRequest
0 голосов
/ 03 февраля 2020

Я довольно новичок в программировании, и я пытался найти следующую ближайшую дату палиндроми c, и я написал следующий код. Но проблема, с которой я сталкиваюсь, заключается в том, что он снова и снова печатает одну и ту же вещь, а не увеличивает дату или месяц. Я пытался отладить это, но я не вижу, где я иду не так, может кто-нибудь, пожалуйста, дайте мне знать, как это сделать!

 public static void main(String[] args) {

    Date date = new Date();
    int year = 1900+date.getYear();
    int month = 1+date.getMonth();
    int currDate = date.getDate();

    String currDate1 = formatter(currDate);
    String month1 = formatter(month);

    String theDate = currDate1+month1+year;

    while(palindromeChecker(theDate)){

        if(month==12) {
            year++;
            month=1;
        }

        if(year%4 == 0 && year%100 !=0 && year%400 == 0) {
            if (month == 2 && currDate == 29) {
                month++;
                currDate = 1;
            }
        }
        else {
            if (month == 2 && currDate == 28) {
                month++;
                currDate = 1;
            }
        }
        switch (month){
            case 1: case 3: case 5: case 7: case 8: case 10: case 12:
                if(currDate==31) month++; currDate=1; break;
            case 4: case 6: case 9: case 11:
                if(currDate==30) month++; currDate=1; break;
        }

        currDate++;

        theDate = formatter(currDate)+formatter(month)+year;

        System.out.println(theDate);
    }

}

public static String formatter(int a){
    return new DecimalFormat("00").format(a);
}

public static boolean palindromeChecker(String a){
    String b = new StringBuilder(a).reverse().toString();
    if(a.equals(b)) return false;
    else return true;
}

Ответы [ 2 ]

0 голосов
/ 03 февраля 2020

Это хорошее упражнение, но, к сожалению, вы делаете это неправильно. Я полагаю, что самое худшее, что я могу сделать, - это решить проблему для вас и опубликовать полный и / или исполняемый код. Поэтому я постараюсь направить вас к правильному пути решения задачи. Пожалуйста, не стесняйтесь следить за комментариями, если вы пытаетесь столкнуться с проблемами.

java .time

Сначала используйте LocalDate для даты, а не Date. Несмотря на название, класс Date представляет не дату, а момент времени (и в этот момент он никогда не бывает одинаковым во всем мире). Напротив, LocalDate - это точно дата без времени суток и без часового пояса. Как раз то, что вам нужно. Также класс Date всегда был плохо спроектирован и теперь давно устарел.

Для получения текущей даты в вашем часовом поясе используйте, например,

    LocalDate date = LocalDate.now(ZoneId.systemDefault());

Вы можете передать другой часовой пояс метод now, если хотите.

Для преобразования даты в строку, чтобы вы могли проверить, является ли это палиндром, используйте DateTimeFormatter и метод format LocalDate. Вы можете использовать DateTimeFormatter.ofPattern() для создания форматера. Когда все это звучит расплывчато или даже непонятно, используйте вашу поисковую систему, чтобы найти примеры и учебные пособия, которые выложат sh намного больше, или посмотрите документацию, воспользуйтесь ссылками внизу.

Ваш способ проверить, является ли строка палиндромом, очень изящен, поэтому вам следует придерживаться ее.

Когда одна дата оказывается не палиндромом, используйте метод plusDays из LocalDate, чтобы добавить 1 день, так что вы получите на следующий день. LocalDate знает следующий день, поэтому вам не нужно заботиться ни о количестве дней в каждом месяце, ни о високосных годах, все это позаботится о вас. Только помните, что plusDays() возвращает новый LocalDate экземпляр, который вам нужно сохранить в вашей переменной.

Links

0 голосов
/ 03 февраля 2020

Отлично работает в первые дни, потому что это февраль. Вы сделали это правильно для этого особого случая.

Затем, для марта, вы продолжаете сбрасывать день на 1 снова и снова в своем месячном чеке внутри инструкции переключения регистра. Попробуйте переместить строку "currDate = 1;" внутри блока if.

Проблема возникает, потому что вы помещаете оба оператора в одну строку без скобок.

if(currDate==30) month++; currDate=1;

Пожалуйста, всегда используйте скобки для таких блоков, как это (это тоже часть руководящих принципов кодирования):

if(currDate==30) {
    month++;
    currDate=1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...