2014-04-17 6 views
1

평일의 범위를 반복하려고합니다. 각 요일은 정수 (Sunday = 1, Monday = 2, ..., Saturday = 7)에 매핑됩니다.평일의 하위 범위를 반복하십시오.

범위는 start and end day으로 정의됩니다. 범위가 Friday(6) - Monday(2)처럼, 마지막에 분할 일주일의 시작 때 내가 어려움에 봉착

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

: 이것은 내가 할 단지 수, Monday(2) - Thursday(5) 같은 시작과 끝 날 괜찮습니다. 이것은 분명히 위 for 루프에서 작동하지 않습니다.

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는 계산이 다시 day을 포장한다 (8)이된다 ~ 1 : (8 - 1) % 7 + 1 == 1.

+0

startDay를'와 같은 범위를 감안할 때 = 6 and endDay = 3', 이것은 여전히 ​​전혀 실행되지 않습니까? 'startDay를 + (endDay 또는 - - startDay를)가 '= '6 + (3-6) '= '3' 이 결과 : '위해 (3 = 1이 <; I = 6 int로 난 ++) { ...}' 어느 쪽을 실행하지 않습니까? – Kumalh

+0

이제 수정해야합니다. –

+0

'... 8 - (startDay - endDay);가 아닌'... 7 - (startDay - endDay); '이되어야합니까? 그렇지 않으면 추가 하루가 항상 추가됩니다. – Kumalh

0

당신은 원형의 어떤 종류의 % 연산자를 사용할 수

for (int i=6; i!=2; i=(i+1)%7) { ... } 

그 것이다 인덱스 일 0 ... 일요일 = 0 그래서 토요일 = 6. 당신이 정말로 지수는 1부터 갖고 싶어 그것은 단지 해석의 문제 일뿐입니다. 당신은 예를 들어 수행 할 수 있습니다 어떤이를 선호 할 수도,

for (int day = startDay; ; day = (day - 1) % 7 + 1) { 
    // ... do your stuff 
    if (day == endDay) { 
     break; 
    } 
} 

또는 : 아마 깨끗한 그냥 break를 사용하는 것

for (int i=6; i!=2; i=(i+1)%7) { 
    int day=i+1; 
    // use day here 
} 
+0

0에서 일수를 지정하지 않으려면 어떻게해야합니까? 즉'startDay = 6 and endDay = 3'으로 주어진다면, 나는 단지'6, 7, 1, 2, 3'을보고 싶을 것입니다. 'day 0'이 아닙니다. – Kumalh

+0

편집 된 답변보기. – damgad

0

, 당신은에 대한 모든 다른 경우를 걱정할 필요가 없습니다 :

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

자바 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); 

할 일 - 동안 - 건설 조건 start == end의 루프가 적어도 한 번 실행됩니다 보장합니다.때문에 당신은 DayOfWeek -objects에 이런 식으로 인덱스를 변환 할 수 있습니다

현지화 지표 (일요일 = 1 대신 7)의 사용에

업데이트 :

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