2014-04-17 71 views
1

我試圖遍歷一系列的工作日,其中每個工作日都映射到一個整數(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. 

我可以看到的唯一的解決方案是實現某種循環緩衝區的,我覺得是矯枉過正了這樣一個簡單的問題。我只是被難住了,很可能在這裏丟失了一些明顯的東西。我認爲解決方案可能與模塊化算術有關,但我不太確定。

回答

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

+0

給定一個範圍,比如'朝九特派= 6和endDay = 3',這不會執行嗎? '朝九特派+(endday指定 - 朝九特派)'= '6 +(3 - 6)'= '3' 結果造成: '的for(int i = 6; I <= 3;我++){ ...}' 哪個不會執行? – Kumalh

+0

現在應該修復。 –

+0

應該是...... 7 - (startDay - endDay);'而不是'... 8 - (startDay - endDay);'?否則它會一直增加一天。 – Kumalh

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 
} 
+0

這怎麼能改變爲不索引從0開始的天數?即給定'startDay = 6和endDay = 3',我只想看看'6,7,1,2,3'天。不是'天0' – Kumalh

+0

請參閱編輯答案。 – damgad

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 
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-而建設確保了條件start == end的循環將至少執行一次。

UPDATE由於使用本地化指數(星期日= 1而不是第7號)

可以這樣的指標轉換爲DayOfWeek -objects:

private static DayOfWeek convert(int localIndex) { 
    int iso = localIndex - 1; 
    if (iso == 0) { 
    iso = 7; 
    } 
    return DayOfWeek.of(iso); 
}