我是编程和java的新手,我正在尝试解决以下问题: 在二十世纪的第一个月(1901年1月1日至2000年12月31日),有多少个星期日下降?
这是我的代码:
The field or property '_x0046_or1' does not exist.
如果我打印结果,它似乎工作正常。
我的结果是443,但正确答案是171.我做错了什么?
谢谢!
答案 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);
}
请注意:
答案 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年的每个月的第一天是否是星期日。