2015-01-16 3 views
1

foreach 루프에 사용되는 일부 Java 코드를 살펴 보았지만 너무 복잡해 보입니다.Java Iterator를 사용하는 각 루프에 대해

속성을 포함하는 Control.java 파일이 있습니다.

Iterator를 사용하고 Control을 데이터 형식으로 사용하는 Controls.java 파일이 있습니다.

public class Controls implements Iterable<Control>{ 
    protected ArrayList<Control> controls; 

    public Controls() 
    { 
     controls = new ArrayList<Control>(); 
    } 
    public Controls(ArrayList<Control> controls) 
    { 
     this.controls = controls; 
    } 

    public ArrayList<Control> value() 
    { 
     return controls; 
    } 

    public void add(Control ctrl) 
    { 
     this.controls.add(ctrl); 
    } 

    public void add(Controls ctrls) 
    { 
     for(Control ctrl : ctrls) 
     { 
      this.controls.add(ctrl); 
     } 
    } 

    public void remove(Control ctrl) 
    { 
     if(this.controls.contains(ctrl)) 
     { 
      this.controls.remove(ctrl); 
     } else 
     { 
      for (Control c: this.controls) 
      { 
       if(c instanceof ContainerControl) 
       { 
        ((ContainerControl)c).controls.remove(ctrl); 
       } 
      } 
     } 

    } 


    public Control get(String name) 
    { 
     //stuff here 
    } 

    @Override 
    public Iterator<Control> iterator() { 
     return controls.iterator(); 
    } 
} 

다른 파일 등을 사용

public void dumpInstantiation(StringBuffer buf) 
{ 
    for(Control control : controls) 
    { 
     control.dumpInstantiation(buf); 
    } 
} 

나의 이해하려면이 추가 또는 제거 (또는 다른 메소드를 호출) 각 컨트롤은 반복 된 그대로의 추가 혜택과 함께 단지 foreach 루프입니다 . 자바 초보자로서 몇 가지 질문이 떠오른다 :

  1. 이것을 구현하는 쉬운 방법이 있습니까? 이것이 보통 어떻게 이루어 집니까?
  2. 이렇게하면 다른 이점이 있습니까?
  3. ArrayList 및 Iterator없이이 작업을 수행 할 수있는 방법이 있습니까?
+0

"지나치게 복잡하다"고 생각하는 것이 확실하지 않습니다. 'ArrayList'는 반복자를 가지고 있습니다. 그래서'for (SomeType x : list)'라고 말할 수 있습니다. 이'Controls' 클래스는'ArrayList' 반복자를 통해'iterator()'를 구현하기 때문에 for (Control control : controls)는 private'ArrayList' 필드를 통과하는 것과 같습니다. 그 부분은 전혀 복잡하지 않습니다. 'add'와'remove' 메소드는 이것과 아무런 관련이 없습니다. – ajb

답변

3

더 쉬운 구현 방법이 있습니까? 이것이 보통 어떻게 이루어 집니까? 자바 foreach 구조를 사용하기 위해서는

, 당신의 클래스는 Iterable 인터페이스를 구현하고 목록을 통해 필요한 방법을 "반복 처리"내 충분한 기능을 제공하고 각 항목을 반환해야합니다. 대개 이것은 아이템이 남아있을 때와 단계별로 아이템을 반환하는 방법을 알 필요가 있음을 의미합니다. 인터페이스 API는 메소드가 "필수"(즉, 메소드를 선언해야하지만 구현을 제공 할 수 없음) 여부를 알려줍니다. 더 쉬운 방법은 기존 컬렉션 유형을 활용하는 것이므로 직접 만들 필요가 없습니다.

이렇게하면 다른 이점이 있습니까?

이 할 수있는 방법이 있나요 그것은 사용자가 목록을 반복 할 수 있도록하는 좋은 방법을 제공하는 좋은 방법이고, 그것은 Iterable

에서 작동 다른 인터페이스와 호환 클래스를 만든다 ArrayList와 Iterator가 없으면?

이미 이터레이터를 구현 한 기존 컬렉션에 클래스를 래핑 할 수 있지만, 이는 귀하에게 달려 있습니다.

+0

감사! 나는 그것을 조금 더 이해했다. –

1

그래서 for-each 루프에는 'arguments'가 두 개 있습니다.
  1. 배열의 각 항목 값을 하나씩 하나씩 지정하는 변수입니다.
  2. 배열 또는 ArrayList 등

예 :

public class Test { 
    public static void main(String[] args) { 

     int[] numbers = new int[] {3,8,5,2}; 

     for (int i : numbers) 
      System.out.println(i); 

    } 
} 

인쇄 : 당신이 볼

 
3 
8 
5 
2 

, 그것은 어려운 아니에요!

그리고, 대신 일반 배열, 동적 항목을 추가/제거 할 수 ArrayList 클래스를 사용할 수 있습니다

import java.util.ArrayList; 

public class Test { 
    public static void main(String[] args) { 

     ArrayList<Integer> numbers = new ArrayList<Integer>(); 
     numbers.add(3); 
     numbers.add(8); 
     numbers.add(5); 
     numbers.add(2); 
     for (int i : numbers) 
      System.out.println(i); 

    } 
} 

인쇄 동일.

이 답변에 대한 질문이 있습니까?

+0

첫 번째 예제에서는 목록을 사용할 필요가있다. numbers = new ArrayList (); 대신에 int [] numbers = new int [] {3,8,5,2}; 왜냐하면 당신이 CANT가 정상적인 배열로 foreach 루프를 수행한다는 인상하에 있기 때문입니다. –

+0

int [] numbers **는 실제로는 일반 배열이므로 ** 할 수 있습니다. 그러나 ArrayList에 원시 데이터 유형 (int, byte 등)을 사용할 수 없습니다. 예를 들어 'ArrayList = new ArrayList ();'을 사용해야합니다. 대신. 아, 문자열은 텍스트가 아니라 숫자를 의미합니다. – SWdV

+0

고마워, 나는 당신이 (나를 혼란스럽게 만들었습니다) 할 수 없다고 생각했고, 나의 예가 그 자체를 사용했기 때문에 원시적 인 데이터 유형에 대해 알지 못했습니다. 나는 또한 그것을 모두 String으로 쓰려고했으나 당신의 모범을 다시 읽을 때 내 마음을 바꾸었다. –

관련 문제