如何在类数组中存储内容?

时间:2017-09-09 20:50:44

标签: java arrays class date

我试图编写一个名为january的日期对象数组,并填写2017年1月1日 - 2017年1月31日。

我已经创建了一个名为Date的课程,并存储了String个月,int天和int年。但我需要一种更快的方式来存储所有这些数据。另外,我想知道你是否可以创建一个名为ToString()的函数,它返回一个包含给定日期的格式很好的字符串。

这是我到目前为止所做的:

Date[]january = new Date[31];
january[0].months = "January";
january[0].days = 1;
january[0].years =2017;
january[1].months = "January";
january[1].days = 2;
january[1].years =2017;

3 个答案:

答案 0 :(得分:2)

首先,该代码将崩溃。当您创建Date[31]时,您需要创建数组,该数组将填充空值。当您尝试在null对象上设置属性时,您的程序将崩溃。在设置january[0]的属性之前,需要将其初始化为new Date()(或任何适当的构造函数)。

您可以使用for循环生成所有日期,而不是手动写出所有日期。

Date[] january = new Date[31];
for (int i = 0; i < january.length; i++) {
    january[i] = new Date();
    january[i].months = "January";
    january[i].days = i + 1;
    january[i].years = 2017;
}

请注意,在设置日期时,必须将1添加到i,因为数组是零索引的,但是月份的日期不是。

编辑:这是我根据问题中的代码简单实现Date:

public class Date {
    private String months;
    private int days;
    private int years;

    @Override
    public String toString() {
        return months + " " + days + ", " + years;
    }
}

答案 1 :(得分:1)

如果这是真正的工作而不是作业,我会:

  • 使用java.time对象进行日期工作,而不是自己制作。
  • 使用ArrayList而不是数组。

YearMonth类代表年月。

Month是一个enum,有十几个预先定义的对象,一个对象是一月到十二月的每个月。

LocalDate是一个仅限日期的值,没有时间和没有时区。

Listinterfaceordered collectionArrayList是特定的实现。

YearMonth ym = YearMonth.of( 2017 , Month.JANUARY ) ;
int monthLength = ym.lengthOfMonth() ;
List< LocalDate > daysInJanuary = new ArrayList<>( monthLength ) ;
for( int i = 1 ; i <= monthLength ; i ++ ) {
    LocalDate ld = ym.atDay( i ) ;
    daysInJanuary.add( ld ) ;
}
  

daysInJanuary.toString():[2017-01-01,2017-01-02,2017-01-03,2017-01-04,2017-01-05,2017-01-06,2017-01- 07,2017-01-08,2017-01-09,2017-01-10,2017-01-11,2017-01-12,2017-01-13,2017-01-14,2017-01-15, 2017-01-16,2017-01-17,2017-01-18,2017-01-19,2017-01-20,2017-01-01,2017-01-22,2017-01-23,2017- 01-24,2017-01-25,2017-01-26,2017-01-27,2017-01-28,2017-01-29,2017-01-30,2017-01-31]

要生成一个表示每个日期值的格式良好的字符串,我会让java.time自动进行本地化。

Locale locale = Locale.CANADA_FRENCH ;  // Or Locale.US, etc.
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL ).withLocale( locale ) ;

for( LocalDate ld : daysInJanuary ) {
    String output = ld.format( f ) ;
    System.out.println( output ) ;
}

输出是这样的,取决于Locale

  

2017年1月1日星期日

     

2017年1月2日星期一

     

2017年1月3日,星期二

     

...

code run live at IdeOne.com。但请注意,IdeOne.com仅限于一个LocaleLocale.US

答案 2 :(得分:-1)

import java.util.*;
import java.text.SimpleDateFormat;

Date[]january = new Date[31];
for(int i=0;i<31;i++){ // or use january.length in place of 31
    january[i] = new Date(2017, 0, (i+1));
    System.out.println(formatDate(january[i]));
}

public static String formatDate(Date date){
       return (new SimpleDateFormat("MMMM").format(date) + " "+ new SimpleDateFormat("DD").format(date)  + ","+ date.getYear());
}

用于循环或其他循环,因为只有日期在您的代码中发生变化。