爪哇岛:二十世纪的第一个月(1901年1月1日至2000年12月31日)有多少个星期日下降?

时间:2017-06-21 15:03:06

标签: java

我是编程和java的新手,我正在尝试解决以下问题: 在二十世纪的第一个月(1901年1月1日至2000年12月31日),有多少个星期日下降?

这是我的代码:

    The field or property '_x0046_or1' does not exist.

如果我打印结果,它似乎工作正常。

我的结果是443,但正确答案是171.我做错了什么?

谢谢!

7 个答案:

答案 0 :(得分:12)

我怀疑443是二十世纪一月份的星期日总数。发生这种情况是因为你走过了二十世纪所有可能的日子,然后检查当前月份是否是一月以及当天是否是星期天。

这不是你想要的。

我会使用不同的方法:

  • 每年每个月的第一天走。
  • 然后检查它是否是星期天。

代码可能会快得多。

// Each year
for (int y = 1901; y < 2001; y++) {
    // Each month of the year
    for (int m = 1; m <= 12; m++) {
        if (LocalDate.of(y, m, 1).getDayOfWeek() == DayOfWeek.SUNDAY) {
            count++;
        }
    }
}

PS:如果您将date1.getMonth() == JANUARY更改为date1.getDayOfMonth() == 1,那么您的代码就是正确的。然而,效率非常低,因为它检查二十世纪的每一天,而它只需要检查每个月的第一天。我的机器上面的代码快了大约40倍。

使用Todd&#39; Java-TimeStream,功能风格:

YearMonthStream
    .from(YearMonth.of(1901, 1))
    .until(YearMonth.of(2000, 12))
    .stream()
    .map(ym -> ym.atDay(1).getDayOfWeek())
    .filter(DayOfWeek.SUNDAY::equals)
    .count();

答案 1 :(得分:6)

除了已被标记的错误之外,您可以重新考虑您的设计并使用the YearMonth class,这似乎比LocalDate更适合您的用例:

public static void main(String[] args) {
  YearMonth start = YearMonth.of(1901, 1);
  YearMonth end = YearMonth.of(2000, 12);

  int count = 0;
  for (YearMonth ym = start; !ym.isAfter(end); ym = ym.plusMonths(1)) {
    //is first day of month a sunday?
    if (ym.atDay(1).getDayOfWeek() == SUNDAY) count ++;
  }

  System.out.println(count); //171
}

答案 2 :(得分:4)

我看到一些错误:

public static void main(String[] args) {
    int count, sum = 0;           
    for (int i = 1901; i < 2001; i++) { // There is a mistake here, I dont know what you want to compute in this loop!
        LocalDate test = LocalDate.of(i,1,1);
        sum += test.lengthOfYear();
    }
    for (int i = 1; i < sum; i++) {
        LocalDate date1 = LocalDate.of(1901,1,1); // There is a mistake here, date1 must be outside of this loop
        date1 = date1.plusDays(i); // There is a mistake here, plusDays why?? 
    if(date1.getMonth() == JANUARY && date1.getDayOfWeek() == SUNDAY) { // There is a mistake here, why are you cheking this: date1.getMonth() == JANUARY ?
        count++;
        }
    }
    System.out.println(count);
}

一个简单的解决方案:

public static void main(String[] args) {
    int count = 0;
    LocalDate date1 = LocalDate.of(1901, Month.JANUARY, 1);
    LocalDate endDate = LocalDate.of(2001, Month.JANUARY, 1);
    while (date1.isBefore(endDate)) {
        date1 = date1.plusMonths(1);
        if (date1.getDayOfWeek() == DayOfWeek.SUNDAY) {
            count++;
        }
    }
    System.out.println(count);
}

答案 3 :(得分:3)

首先查找您要检查的期间内的天数,然后启动for循环以运行该期间。到现在为止还挺好。但是你增加计数的条件是错误的:

if(date1.getMonth() == JANUARY && date1.getDayOfWeek() == SUNDAY)

这意味着当您每天循环播放时,如果该日期是1月份的星期日,则会增加count。你不会检查那个星期日是否是1月的第一个星期日,而且从2月到12月你不会算什么。

你应该检查它是在一个月的第一天和周日,而不是一年中的第一个月和周日。

答案 4 :(得分:2)

以下代码应输出正确的值。

public static void main(String[] args) {
    int count = 0, sum = 0;
    for (int i = 1901; i < 2001; i++) {
        LocalDate test = LocalDate.of(i, 1, 1);
        sum += test.lengthOfYear();
    }

    for (int i = 1; i < sum; i++) {
        LocalDate date1 = LocalDate.of(1901, 1, 1);
        date1 = date1.plusDays(i);
        if (date1.getDayOfMonth() == 1 && date1.getDayOfWeek() == java.time.DayOfWeek.SUNDAY) {
            count++;
        }
    }

    System.out.println(count);
}

请注意:

  1. 您不需要检查该月份是否为1月,因为您的要求是该月的任何一个月。
  2. 您还必须确保当天是该月的第一天。

答案 5 :(得分:0)

443是1月份的星期日,如果你想在本月的第一天星期日,你必须将你的代码更改为:

String expression = "blabla if(x = 6, statement1, statement2) blabla";

消化:每年的所有日子,你可以在12个月的日期中添加1个月,而不是走路:

String expression = "blablaba iF(X = 6, if(X = 3, Z, Y), Y) bablabla";

答案 6 :(得分:0)

你只考虑从1901年到2000年的1月,这是不正确的,你应该考虑从1901年到2000年的每个月的第一天是否是星期日。