2017-09-11 1 views
3

내가 for 루프 (305)에서 시작하여 문제 397자바에서 for 루프의 숫자를 건너 뜁니다. 어떻게하면 더 깨끗하게 만들 수 있습니까?

for (int i = 305; i < 397; i++) { 
    //do stuff 
} 

에서 끝나는 만들어야 I 310, 321, 332, 343, 354, 365, 376, 및 387

를 이동해야

int[] skip = { 310, 321, 332, 343, 354, 365, 376, 387 }; 
for (int i2 : skip) { 
    if (i != i2) { 
     //do stuff 
    } 
} 

그러나이를 달성하기 훨씬 더 효율적이고 깨끗한 방법이 같은 느낌 :

나는 내가 루프에서 다음을 배치하여이 작업을 수행 할 수 있습니다 알고 있습니다.

+0

괜찮을 것입니다. 그것으로 가라. 어레이를 두 루프 외부에 두십시오. – duffymo

+0

int의 배열 목록 또는 해시 세트를 건너 뛰고 루프에서'contains'를 확인하십시오. –

+1

두 번째 숫자가 세 번째 숫자보다 하나 더 높을 때마다 정수가 무시되는 패턴을 보았습니다. 건너 뛰기 목록 대신이 패턴을 사용할 수 있습니다. –

답변

5

자바 8을 사용하는 경우 새로운 스트림 API를 IntStream과 함께 사용할 수 있습니다. 또한 Set를 사용하여 멤버쉽을 신속하게 확인해야합니다. Sets.newHashSetguava의 도우미이지만 직접 손으로 HashSet을 만들 수도 있습니다.

Set<int> intsToSkip = Sets.newHashSet(310, 321, 332, 343, 354, 365, 376, 387); 
IntStream.range(305, 397) 
    .filter(i => ! intsToSkip.contains(i)) 
    .forEach(i => { 
     // do stuff 
    }) 
0

이전에 자바 8이 작업을 수행 할 수있는 경우 :

List<Integer> skip = Arrays.asList(310, 321, 332, 343, 354, 365, 376, 387); 

for (int i = 305; i < 397; i++) { 
    if(skip.contains(i)){ 
     continue; 
    } 
    //do stuff 
} 
3

Java8 솔루션은 다음과 같을 수 있습니다 : 당신은 11의 차이를 건너 뛰는 숫자 이후

List<Intger> valuesToProcess = IntStream.range(305,397).collect(Collectors.toList()); 
valuesToProcess.removeAll(Arrays.asList(310, 321, 332, 343, 354, 365, 376, 387)); 

for(Integer value : valuesToProcess) { 
    // do stuff here 
} 
0

루프 앞에 -5라는 변수를 할당하고 for 루프의 값을 증가시킬 수 있습니다. X의 모듈이 0 루프

X = -5 
for (int i = 305; i < 397; i++) { 
if(X%11==0) 
    X = X+1; 
    continue; 
X = X+1; 
//your stuff 
} 
+0

초기 할당 즉 -5를 확인하십시오. 절차는 동일합니다 –

6

계속 될 때마다 당신은 단순히 루프의 시작 if (i % 11 == 2) continue;을 추가 할 수 있습니다

당신이 숫자마다 11 단계를 건너 뛸 때문이다
for (int i = 305; i < 397; i++) { 
    if (i % 11 == 2) continue; 
    //do stuff 
} 

, 310에서 시작합니다. i - 310이 11의 배수 인 숫자는 건너 뛰고 자하므로 i - 310 + 11*X은 X가 11 인 배수입니다. 따라서 i - 310 + 11 * 28i - 2이므로 X에 대해 28을 선택했습니다. 이것은 읽기가 더 쉽습니다. 마지막으로 테스트는 (i - 2) % 11 == 0이며 i % 11 == 2과 같습니다. 이 계산법은 기본 모듈러 산술으로 명명됩니다.

+0

좋은 퍼즐, 그렇지 않습니다. – blafasel

+0

또한 명세서를 추가하는 _why_를 설명해야합니다. –

+1

예, 맞습니다. 답변을 업데이트했습니다. –

1

무시할 숫자의 패턴이있는 것 같습니다.

두 번째 숫자가 정확히 세 번째 숫자보다 하나 많으면 숫자를 무시합니다.

for (int i = 305; i < 397; i++) { 
    String s = String.valueOf(i); 
    if (s.charAt(1) == s.charAt(2) + 1) { 
     continue; // ignore 
    } 
    //do stuff 
} 
1

한 가지 가능한 해결책은 다음과 같습니다 당신은 단순히 루프를 처리하지 않으려는

import java.util.Arrays; 
import java.util.List; 
import java.util.stream.IntStream; 

public class Test { 
    public static void main(String... args) { 
     final Integer[] ignore = new Integer[]{310, 321, 332, 343, 354, 365, 376, 387}; 
     final List<Integer> ignoreList = Arrays.asList(ignore); 
     try (
       final IntStream stream = IntStream.rangeClosed(305, 397)) { 
      stream.filter(x -> !ignoreList.contains(x)).forEach(System.out::println); 
     } 
    } 
} 

는 사람들을 한 후, 루프 매개 변수에서 목록을 만들 제거하는 청소기있을 수 있지만 그 제한된 목록 (Timothy Truckle의 대답 참조)을 통해.

2

건너 뛸 번호는 i % 11 == 2 인 번호입니다.

이 사용하여 자바 8 방법은 다음과 같습니다

IntStream.range(305, 397) 
    .filter(i -> i % 11 != 2) 
    .forEach(i -> { 
     // do stuff 
    }); 

그리고 이전의 자바 버전

는 수행

for (int i = 305; i < 397; i++) { 
    if (i % 11 != 2) { 
     // do stuff 
    } 
} 
0

0으로 skipindex을 초기화하기와 skipindex을 증가 할 수있는 skipindex 값에 도달 할 때

int index=0; 
skiplist={310,321,332..... 
for (int I=310..){ 
if (skiplist[index]==I){ 
index++; 
continue; 
} 
} 
//Code to be processed here. 
0

i%11 == 2 해결책은 시원합니다. 당신이 건너 뛰고 자하는 숫자에 대한 패턴이 없다면 (또는 나처럼 생각할 수도 없다). 중첩 된 조회 루프 나 해시 세트를 포함하지 않는 깨끗한 솔루션이 있습니다.

int [] ranges = {304, 310, 321, 332, 343, 354, 365, 376, 387, 397}; 
for (int i = 0; i < ranges.length; i++) { 
    int lo = ranges[i] + 1; 
    int hi = ranges[i+1]; 
    for (int j = lo; j < hi; j++) { 
     // do stuff 
    } 
} 
관련 문제