Есть ли лучший способ написать этот код для Java?или сделать его чище? - PullRequest
2 голосов
/ 26 марта 2011

Я написал этот код как часть проекта, и это не кажется самым эффективным. Есть ли более чистый способ написать этот метод?

public static int numberMonth(int parseMonth, Boolean leapYear)
        {
            int month = 0;
            if (parseMonth < 1)
            { month = 0;
                if (parseMonth < 2)
                { month =+ 31;
                    if (parseMonth < 3)
                    {
                        if (leapYear)
                        {
                        month =+ 29;
                        }
                        else if(!(leapYear))
                        {
                            month=+28;
                            if (parseMonth < 4)
                            {
                                month =+ 30;
                                if (parseMonth < 5)
                                {


                                    month =+ 31;
                                if (parseMonth < 6)
                                {
                                    month =+ 31;
                                    if (parseMonth < 7)
                                    {
                                        month =+ 30;
                                        if (parseMonth < 8)
                                        {
                                            month =+ 31;
                                            if (parseMonth < 9)
                                            {
                                                month =+ 31;
                                                if (parseMonth < 10)
                                                {
                                                    month =+ 30;
                                                    if (parseMonth < 11)
                                                    {
                                                        month =+ 31;
                                                        if (parseMonth < 12)
                                                        {
                                                            month =+31;
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
          }

Ответы [ 3 ]

1 голос
/ 26 марта 2011

Ваш оригинальный код имеет много проблем.Он не возвращает значение (вы, очевидно, намереваетесь вернуть month, но компилятор этого не знает. Он не достигнет того кода, который вам нужен. Есть и другие проблемы, и хотя они выигралине мешают вашему коду работать, они не дадут кому-либо понять его. Что означает parseMonth? Что означает leapYear? Почему переменная с именем month может содержать значения, намного превышающие количество месяцев в году?? Нет комментариев, объясняющих это.

Если бы я писал эту функцию, я написал бы следующее (на основе кода AndyMac с некоторыми небольшими изменениями):

public static int numberOfDaysBeforeMonth(int monthNumber, boolean leapYear)
{
    //if monthNumber is out of range, return -1
    if(monthNumber< 1 || monthNumber > 12)
         return -1;

    int[] daysPerMonth= {31,28,31,30,31,30,31,31,30,31,30,31};

    int numberOfDays = 0;

    //add up the days in the months preceding the month in question
    for (int month = 1; month < monthNumber; month++)
       numberOfDays += daysPerMonth[month - 1];

    //add an extra day if it was a leap year and the month is after February
    if (leapYear && monthNumber > 2)
        numberOfDays++;

    return numberOfDays;
}
1 голос
/ 26 марта 2011

codaddict, я думаю, что это почти правильно. Я думаю, что он пытается добавить дни в году, поэтому вам просто нужно поместить переменную дней в цикл:

public static int numberMonth(int parseMonth, String leapYear)
{
    if(parseMonth<1 || parseMonth>12) {
         return 0;
    }
    int[] monthArray = {31,28,31,30...};
    int days = monthArray[0];
    for (int ii = 1; ii < parseMonth; ii++) {
       days += monthArray[parseMonth];
    }
    if (leapYear.equals("leap") && parseMonth > 1) {
        days++;
    }
    return days;
}

Но я думаю, что вместо этого ОП должен посмотреть на Календарь. Проверь пару ответов в этой теме: Рассчитать дни в году

0 голосов
/ 26 марта 2011

Ну вот, кстати, код просто не работает. Импл. основан на , так что если parseMonth = 4, то месяц = ​​31 + 28 + 31 .

Идея простейшая, которую вы можете получить: ничего не суммируйте во время выполнения, сделайте это один раз во время инициализации. Вы можете инициализировать days[] вручную, но я надеюсь, что теперь все ясно.

package t1;

import java.util.Calendar;
import java.util.GregorianCalendar;

public class MonthyDays {
    static final int[] days;
    static{
        int first = 1;//should be zero for decent logic
        days=new int[first+Calendar.UNDECIMBER];

        GregorianCalendar c=new GregorianCalendar();
        c.set(1999, 0, 1, 0, 0,0);//use some non leap year      
        for (int i=Calendar.JANUARY;i<Calendar.UNDECIMBER;i++){
            days[first+i] = c.get(Calendar.DAY_OF_YEAR)-1;
            c.add(Calendar.MONTH, 1);
        }
    }
    public static int numberMonth(int parseMonth, String leapYear){
        if (parseMonth<=0 || parseMonth>12)
            return 0;//should be IndexOutOfBounds; i.e. the chech should be removed;

        int day = days[parseMonth];
        if (parseMonth>2 && "leap".equals(leapYear))//avoid NPE
            day++;
        return day;
    }

    public static void main(String[] args) {
        System.out.println(numberMonth(2, "leap"));
        System.out.println(numberMonth(3, "leap"));

        System.out.println(numberMonth(1, "leap"));
        System.out.println(numberMonth(1, "leap"));

        System.out.println(numberMonth(12, ""));
        System.out.println(numberMonth(12, "leap"));

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...