我试图迭代一系列工作日,其中每个工作日映射到整数(Sunday = 1, Monday = 2, ..., Saturday = 7)
。
范围由start and end day
定义。这对于Monday(2) - Thursday(5)
这样的开始和结束日来说很好,我可以这样做:
for(int i = startDay; i <= endDay; i++) { ... }
当范围在一周结束和一周开始时分开时,我很困难,例如Friday(6) - Monday(2)
。这显然不适用于上面的循环 - 例如
for(int i = 6; i <= 2; i++) { ... } // wouldn't even execute once.
我能看到的唯一解决方案是实现某种循环缓冲区,我认为这对于这样一个简单的问题来说太过分了。我只是难倒,很可能在这里遗漏了一些明显的东西。我认为解决方案可能与模块化算法有关,但我不太确定。
答案 0 :(得分:1)
你可以这样做:
int numberOfDays = endDay >= startDay ? endDay - startDay : 8 - (startDay - endDay);
for (int i = startDay; i <= startDay + numberOfDays; i++) {
int day = (i - 1) % 7 + 1;
}
这使用%
模运算符来确保所有值都保持在1 - 7之内。
例如,一旦i
变为8,计算就会将day
换回1:(8 - 1) % 7 + 1 == 1
。
答案 1 :(得分:0)
您可以使用%运算符进行某种循环
for (int i=6; i!=2; i=(i+1)%7) { ... }
那将从0开始指数天,所以星期日= 0 ...星期六= 6.如果你真的想让索引从1开始,它只是解释问题。例如,你可以这样做:
for (int i=6; i!=2; i=(i+1)%7) {
int day=i+1;
// use day here
}
答案 2 :(得分:0)
使用break
可能最清楚,那么您不必担心所有不同的情况:
for (int day = startDay; ; day = (day - 1) % 7 + 1) {
// ... do your stuff
if (day == endDay) {
break;
}
}
或者,有些人可能更喜欢这个:
int day = startDay;
while (true) {
// ... do something
if (day == endDay) {
break;
}
day = (day - 1) % 7 + 1;
}
或:
int day = startDay;
while (true) {
// ... do something
if (day == endDay) {
break;
}
if (++day > 7) {
day = 1;
}
}
尝试使用for
循环正确获取所有不同情况可能会令人头疼。你必须确保处理这些:
startDay == 1, endDay == 7
endDay == startDay
endDay == startDay - 1 (which should go through every day of the week in some order)
endDay > startDay
endDay < startDay
答案 3 :(得分:0)
在Java 8中:
// input section
DayOfWeek start = DayOfWeek.FRIDAY;
DayOfWeek end = DayOfWeek.MONDAY;
// execution section
DayOfWeek dow = start;
DayOfWeek stop = end.plus(1);
do {
// ... your code
dow = dow.plus(1);
} while (dow != stop);
do-while-construction确保对于条件start == end
,循环将至少执行一次。
由于使用您的本地化索引而更新(星期日= 1而不是7)
您可以将索引转换为DayOfWeek
- 这样的对象:
private static DayOfWeek convert(int localIndex) {
int iso = localIndex - 1;
if (iso == 0) {
iso = 7;
}
return DayOfWeek.of(iso);
}