1

我正在尝试遍历一系列工作日,其中每个工作日映射到一个 integer (Sunday = 1, Monday = 2, ..., Saturday = 7)

范围由 a 定义start and end day。这对于像这样的开始和结束日来说很好Monday(2) - Thursday(5),因为我可以这样做:

for(int i = startDay; i <= endDay; i++) { ... } 

当范围在一周的结束和开始时分开时,我遇到了困难,比如Friday(6) - Monday(2). 这显然不适用于上述 for 循环 - 例如

for(int i = 6; i <= 2; i++) { ... }    // wouldn't even execute once. 

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

4

4 回答 4

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

于 2014-04-17T15:41:43.653 回答
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
 }
于 2014-04-17T15:44:35.493 回答
0

使用 a 可能是最清楚的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
于 2014-04-17T15:57:01.980 回答
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这种方式将索引转换为 -objects:

private static DayOfWeek convert(int localIndex) {
  int iso = localIndex - 1;
  if (iso == 0) {
    iso = 7;
  }
  return DayOfWeek.of(iso);
}
于 2014-04-17T16:03:23.353 回答