문제

다음과 같은 코드를 자주 봅니다.

Iterator i = list.iterator();
while(i.hasNext()) {
    ...
}

하지만 나는 (Java 1.5를 사용할 수 없거나 각각을 사용할 수 없는 경우) 다음과 같이 작성합니다.

for(Iterator i = list.iterator(); i.hasNext(); ) {
    ...
}

왜냐하면

  • 더 짧습니다
  • 그것은 유지한다 i 더 작은 범위에서
  • 혼란의 가능성을 줄여줍니다.(이다 i 한 번에 사용 되었습니까?어디에 i 선언?)

복잡한 일을 하려면 복잡한 코드만 만들면 되도록 코드는 최대한 이해하기 쉬워야 한다고 생각합니다.어떻게 생각하나요?어떤게 더 좋아?

에서: http://jamesjava.blogspot.com/2006/04/iteating.html

도움이 되었습니까?

해결책

나는 반복자의 범위를 for 루프로 설정하기 때문에 for 루프를 선호합니다.

다른 팁

while, for 및 foreach 구문에 대한 적절한 용도가 있습니다.

  • while - 반복 중이고 반복 여부를 결정하는 요소가 단지 조건에 따라 결정되는 경우 이 방법을 사용하세요.이 루프 구성에서 인덱스를 유지하는 것은 부차적인 관심사일 뿐입니다.모든 것은 조건에 따라 이루어져야 한다

  • for - 루핑 중이고 주요 관심사가 배열/컬렉션/목록의 인덱스인 경우 이것을 사용하십시오.겪을 가능성이 가장 높은 경우 for를 사용하는 것이 더 유용합니다. 모두 어쨌든, 특정 순서로 요소를 검색합니다(예: 정렬된 목록에서 뒤로 이동).

  • foreach - 순서와 상관없이 컬렉션만 살펴보는 경우에 사용하세요.

분명히 위의 사항에는 예외가 있지만 어느 것을 사용할지 결정할 때 사용하는 일반적인 규칙입니다.제가 자주 사용하는 경향이 있다고 하더군요 foreach 더 자주.

for-each 구성을 사용하지 않는 이유는 무엇입니까?(저는 한동안 Java를 사용하지 않았지만 C#에는 이 기능이 있으며 Java 1.5에도 이 기능이 있다고 확신합니다.)

List<String> names = new ArrayList<String>();
names.add("a");
names.add("b");
names.add("c");

for (String name : names)
    System.out.println(name.charAt(0));

나는 당신이 지적한 것처럼 범위가 여기서 가장 큰 문제라고 생각합니다.

"while" 예제에서 반복자는 루프 외부에서 선언되므로 루프가 완료된 후에도 계속 존재합니다.나중에 동일한 반복자를 다시 사용하면 문제가 발생할 수 있습니다.이자형.g.다른 루프에서 사용하기 전에 초기화하는 것을 잊어버릴 수도 있습니다.

"for" 예제에서 반복자는 루프 내부에 선언되므로 해당 범위는 루프로 제한됩니다.루프 후에 이를 사용하려고 하면 컴파일러 오류가 발생합니다.

반복자를 한 번만 사용하고 버리려는 경우 두 번째 형식이 선호됩니다.그렇지 않으면 첫 번째 양식을 사용해야 합니다.

IMHO, ~을 위한 영어의 관점에서 이 코드를 보면 이 시나리오에서는 루프의 가독성이 떨어집니다.작성자가 남용하는 코드를 작성 중입니다. ~을 위한 루프, 그리고 그것은 예쁘지 않습니다.다음을 비교하십시오:

for (; (currUserObjectIndex < _domainObjectReferences.Length) && (_domainObjectReferences[currUserObjectIndex].VisualIndex == index); ++currUserObjectIndex)
    ++currNumUserObjects;

while (currUserObjectIndex < _domainObjectReferences.Length && _domainObjectReferences[currUserObjectIndex].VisualIndex == index)
{
    ++currNumUserObjects;
    ++currUserObjectIndex;
}

반복할 때 "for" 루프가 더 명확하고 더 적절하다는 데 동의합니다.

"while" 루프는 폴링에 적합하거나 종료 조건을 충족하는 루프 수가 루프 내부 활동에 따라 변경되는 경우에 적합합니다.

이 경우에는 문제가 될 수 없지만 컴파일러, VM 및 CPU에는 일반적으로 내부적으로 사용하는 특별한 최적화 기술이 있어 루프 성능을 향상시키고 가까운 미래에 병렬로 수행할 수 있습니다. 일반적으로 그렇게 하지 않습니다. while 루프(실제로 어떻게 실행될지 결정하기가 더 어렵기 때문).그러나 대부분의 경우 코드 명확성이 최적화보다 중요합니다.

for 루프를 사용하면 현재 작동하는 for 루프에 대한 변수 범위를 설정하므로 단일 변수로 작업할 수 있습니다.그러나 이는 while 루프에서는 불가능합니다..예를 들어:
나는 int;for(i=0;in1;i++) 뭐라도 해라..

for(i=0;i n2;i+=2) 뭔가를 하세요.

따라서 첫 번째 루프 이후에는 마지막에 i=n1-1이 됩니다.그러나 두 번째 루프를 사용하는 동안 i를 다시 0으로 설정할 수 있습니다. 하지만

int i=0;

while(i 제한보다 작음) { 뭔가를 하세요 ..;나++;}

따라서 i는 마지막에limit-1로 설정됩니다.따라서 다른 while 루프에서는 동일한 i를 사용할 수 없습니다.

어느 쪽이든 괜찮습니다.나는 for ()를 직접 사용하고 있는데 컴파일 문제가 있는지 모르겠습니다.나는 둘 다 거의 같은 것으로 최적화되었다고 생각합니다.

가능할 때마다 for 루프를 사용해야 한다는 점에 동의하지만 루프 본문의 반복자를 제어하는 ​​더 복잡한 논리가 있는 경우도 있습니다.이 경우에는 while을 사용해야 합니다.

나는 명확성을 위해 for 루프였습니다.내가 사용하는 동안 while 루프 불확정적인 조건에 직면했을 때.

둘 다 괜찮지만 때로는 Iterator에 직접 액세스하는 것이 유용하다는 점을 기억하십시오(예: 특정 조건과 일치하는 요소를 제거하는 경우 - for(T o 내에서 collection.remove(o)를 수행하면 ConcurrentModificationException이 발생합니다.수집) 루프).

나는 for(blah :어쩌구) [foreach] 구문은 나에게 더 자연스럽게 읽기 쉬운 것 같아서 거의 항상 사용합니다.일반적으로 반복자의 개념은 프로그래밍 외부에서는 실제로 유사점이 없습니다.

학계에서는 프로그램에 대한 추론을 덜 복잡하게 만들기 때문에 while 루프를 선호하는 경향이 있습니다.나는 코드를 더 쉽게 읽을 수 있도록 for- 또는 foreach- 루프 구조를 선호하는 경향이 있습니다.

둘 다 정말 괜찮지만 읽기 쉽기 때문에 첫 번째 예를 사용하는 경향이 있습니다.

while() 루프를 사용하면 각 줄에서 발생하는 작업이 줄어들어 코드를 처음 접하는 사람이 무슨 일이 일어나고 있는지 더 쉽게 이해할 수 있습니다.

이러한 유형의 구성을 사용하면 공통 위치(메소드 상단)에서 초기화를 그룹화할 수 있어 주석 작성도 단순화되고 처음 읽는 사람의 개념화도 단순화됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top