【问题标题】:How do you to store content in a class array?你如何将内容存储在类数组中?
【发布时间】:2017-09-09 20:50:44
【问题描述】:

我正在尝试编写一个名为 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;

【问题讨论】:

  • 欢迎来到 Stack Overflow!请take the tour 了解该网站的运作方式以及此处的主题问题,并相应地编辑您的问题。另见:Why is "Can someone help me?" not an actual question?
  • 编程不像建桥或建房子。如果你失败了,编译器或运行时会告诉你,你会得到尽可能多的机会来修复你的代码,并得到错误消息的帮助。阅读您的教科书或有关 for 循环的 Java 教程,然后尝试一下。没有风险。
  • @你好,我已经从问题中删除了“谢谢”,因为这里要感谢accept the answer that solved your problem and you found most helpful - 当你有足够的代表去做时,也可以投票。跨度>
  • 您可以为您的Date 类配备一个三参数构造函数,这样new Date(2017, "January", 1) 就足以创建一个新对象并将正确的值分配给月、日和年。
  • 现在可能超出了您的范围,但我想向其他人提一下:一旦您了解了enums,您会发现它适合当月而不是使用字符串。

标签: java arrays class date


【解决方案1】:

首先,该代码会崩溃。当您创建 Date[31] 时,您正在创建一个 empty 数组,该数组将被空值填充。当您尝试在空对象上设置属性时,您的程序将崩溃。在设置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;
    }
}

【讨论】:

    【解决方案2】:

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

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

    YearMonth 类代表年月。

    Month 是一个enum,有十几个预定义的对象,一个用于一年中一月至十二月的每个月。

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

    Listinterface 对应 ordered 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-21、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

    【讨论】:

      【解决方案3】:
      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());
      }
      

      使用 for 循环或其他循环,因为您的代码中只有日期在更改。

      【讨论】:

      • 这将引发 NullPointerException。
      • 一月[i] 为空。
      • 如何打印这个数组? System.out.println(january[i]);?
      • 我已经编辑了答案。请检查。输出将类似于 Mon Jan 01 00:00:00 GMT 3917 Tue Jan 02 00:00:00 GMT 3917 Wed Jan 03 00:00:00 GMT 3917 Thu Jan 04 00:00:00 GMT 3917 Fri Jan 05 00: 00:00 GMT 3917 1 月 6 日星期六 00:00:00 GMT 3917 1 月 7 日星期日 00:00:00 GMT 3917 1 月 8 日星期一 00:00:00 GMT 3917 1 月 9 日星期二 00:00:00 GMT 3917 1 月 10 日星期三 00: 00:00 GMT 3917 1 月 11 日星期四 00:00:00 GMT 3917 1 月 12 日星期五 00:00:00 GMT 3917 1 月 13 日星期六 00:00:00 GMT 3917 1 月 14 日星期日 00:00:00 GMT 3917 1 月 15 日星期一 00: 00:00 GMT 3917 1 月 16 日星期二 00:00:00 GMT 3917 等等。
      • 另外,你必须使用 import java.util.*; 因为我们使用的是 Date
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-14
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多