Java: мне нужна помощь в классе Дата - PullRequest
1 голос
/ 08 марта 2011
// Date3.java 
// Date3 class declaration.

public class Date3 
{
   private int month; // 1-12
   private int day; // 1-31 based on month
   private int year; // any year
   private String[] months = new String[]{ "january", "february", "march", "april", "may", "june", "july", "august", "september", "october", "november", "december" }; 


   // constructor: call checkMonth to confirm proper value for month; 
   // call checkDay to confirm proper value for day
   public Date3( int theMonth, int theDay, int theYear )
   {
      month = checkMonth( theMonth ); // validate month
      year = theYear; // could validate year
      day = checkDay( theDay ); // validate day

      System.out.printf( 
         "Date3 object constructor for date %s\n", this );
   } // end Date3 constructor

   public Date3( String m, int d, int y){
       this(m, d, y);
   }

   public Date3( int m, int y){
       this(m,0, y);
   }


   // utility method to confirm proper month value
   private int checkMonth( int testMonth )
   {
      if ( testMonth > 0 && testMonth <= 12 ) // validate month
         return testMonth;
      else // month is invalid 
      { 
         System.out.printf( 
            "Invalid month (%d) set to 1.", testMonth );
         return 1; // maintain object in consistent state
      } // end else
   } // end method checkMonth

   // utility method to confirm proper day value based on month and year
   private int checkDay( int testDay )
   {
      int[] daysPerMonth = 
         { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

      // check if day in range for month
      if ( testDay > 0 && testDay <= daysPerMonth[ month ] )
         return testDay;

      // check for leap year
      if ( month == 2 && testDay == 29 && ( year % 400 == 0 || 
           ( year % 4 == 0 && year % 100 != 0 ) ) )
         return testDay;

      System.out.printf( "Invalid day (%d) set to 1.", testDay );
      return 1;  // maintain object in consistent state
   } // end method checkDay

   public String getMonthString(int month){
        return months[month];
        }


  /* public String monthAsString()
   {
       //returns month as a string rather than an integer
       switch (month)
       {
           case 1: return "January";
           case 2: return "February";
           case 3: return "March";
           case 4: return "April";
           case 5: return "May";
           case 6: return "June";
           case 7: return "July";
           case 8: return "August";
           case 9: return "September";
           case 10: return "October";
           case 11: return "November";
           case 12: return "December";
           default: return "";          
       }         
   }*/




   // return a String of the form month/day/year
   public String toString()
   { 
      return String.format( "%d/%d/%d", month, day, year ); 
   } // end method toString
} // end class Date3





public class Date3Test {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Date3 myDate = new Date3(9, 16, 2011);
        Date3 myDate2 = new Date3("June", 24, 2010);
        Date3 myDate3 = new Date3(259, 2005);

        // all three dates above are equal and will therefore print
        // the same dates

        System.out.println(myDate);
        System.out.println(myDate2);
        System.out.println(myDate3); 

    }

}

Ответы [ 2 ]

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

Я могу понять, почему шаблон, который вы дали, может быть проблематичным для начинающего: С одной стороны, массив месяцев не является статичным, с другой стороны, ваши перегруженные конструкторы не могут получить к нему доступ, пока они делегировать конструктор this (int, int, int).

Чтобы исправить код, который вы должны объявить статическим массивом месяцев, создайте статический метод, который преобразует ваши строки месяца в число месяца. Кроме того, вы должны закомментировать определенные строки , чтобы даже скомпилировать и протестировать это .

Итак, давайте решим (ii) вместе

Заменить:

private String[] months 

с:

private static String[] months 

Заменить:

public Date3( String m, int d, int y){
    this(m, d, y);
}

с:

public Date3( String m, int d, int y){
    this(convMonth(m), d, y);
}
public static int convMonth(String m) {
    int index =1; // january will be 1
    for(String month : months) {
        if(m.equals(month)) break;
        index++;
    }
    return index;
}

Закомментируйте второй конструктор-шаблон примерно так:

/*public Date3( int m, int y){
    this(m,0, y);
}*/

И закомментируйте вызов этого второго конструктора-шаблона в Date3Test.java:

//System.out.println(myDate3); 

Теперь это должно скомпилироваться, запустить и дать вам ответ для (ii). Вы можете решить (iii) самостоятельно, просто внедрив закомментированный второй конструктор-шаблон и повторно активировать этот println ().

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

Хорошо, относительно (iii):

Я предполагаю, что вы не можете использовать класс Date Java, поэтому вам придется сделать это: чтобы преобразовать DDD в месяц и день месяца, вам нужно сначала определить массив дней месяца в этом конкретном год, это зависит, конечно, от того, будет ли февраль того года 28 или 29 дней. В обычном случае это так:

int [] monthDays = new int [12] {31,28,31,30,31,30,31,31,30,31,30,31}

В случае, когда количество лет делится на 4, за исключением лет на 100, кроме 400 (см. Википедию для високосного года), вам придется изменить эти 28 на 29.

Хорошо, чтобы преобразовать ваш DDD, вы можете сделать это: Пройдите через этот массив и пока ваш DDD не станет меньше значения, хранящегося в текущей ячейке, вычитайте текущую ячейку и помните, что вы переместились на один месяц вперед. Пример: DDD = 41 -> вычесть 31 -> дата 10 февраля.

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