在工作日的子范围内迭代

时间:2014-04-17 15:36:05

标签: java dayofweek weekday

我试图迭代一系列工作日,其中每个工作日映射到整数(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. 

我能看到的唯一解决方案是实现某种循环缓冲区,我认为这对于这样一个简单的问题来说太过分了。我只是难倒,很可能在这里遗漏了一些明显的东西。我认为解决方案可能与模块化算法有关,但我不太确定。

4 个答案:

答案 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);
}