2016-09-29 3 views
0

클래스 할당을 위해 처음부터 내 자신의 iterator를 구현해야합니다. 이터레이터는 링크 된 노드 목록을 반복합니다. 반복기를 사용하는 모든 테스트 케이스가 실패하고 그 중 어떤 부분이 잘못되었는지는 알 수 없습니다.반복기가 작동하지 않는 이유는 무엇입니까?

import java.util.Iterator; 
import java.util.NoSuchElementException; 

class LinkedNodeIterator<E> implements Iterator<E> { 
    LinkedNode<E> headNode; 
    LinkedNode<E> curr; 


    // Constructors 
    public LinkedNodeIterator(LinkedNode<E> head) { 
     headNode = head; 
     curr = headNode;  
    } 

    @Override 
    public boolean hasNext() { 
     if(headNode == null) 
      return false; 
     if(curr.getNext() == null) 
      return false; 
     return true; 
    } 

    @Override 
    public E next() { 
    if(curr.getNext() == null || curr == null) 
    throw new NoSuchElementException(); 
     LinkedNode<E> save = curr; 
     curr = curr.getNext(); 
     return save.getData(); 

    } 


    @Override 
    public void remove() { 
    throw new UnsupportedOperationException(); 
    } 
} 

실패 일부 테스트 케이스 (그들은 모두 반환 카운트 = 0) : 여기

public class PublicLinkedSetTest { 
    Set<String> set0; 
    Set<String> set1; 
    Set<String> set2; 
    Set<String> set3; 
    Set<String> set4; 


@Before 
    public void before() { 
    set0 = new LinkedSet<String>(); 
    set1 = new LinkedSet<String>(); 
    for (String e : new String[]{"c", "a", "d", "b", "e"}) { 
     set1 = set1.adjoin(e); 
    } 
    set2 = new LinkedSet<String>(); 
    for (String e : new String[]{"b", "d", "a", "e", "c"}) { 
     set2 = set2.adjoin(e); 
    } 
    set3 = new LinkedSet<String>(); 
    for (String e : new String[]{"a", "d", "b"}) { 
     set3 = set3.adjoin(e); 
    } 
    set4 = new LinkedSet<String>(); 
    for (String e : new String[]{"x", "y", "z", "a", "b", "d"}) { 
     set4 = set4.adjoin(e); 
    } 
    } 

    public void testIterator1() { 
    int count = 0; 
    for (String e : set1) { 
     count += 1; 
    } 
    assertEquals(5, count); 
    } 

    @Test 

    public void testIterator2() { 
    int count = 0; 
    for (String e : set2) { 
     count += 1; 
    } 
    assertEquals(5, count); 
    } 

    @Test 

    public void testIterator3() { 
    int count = 0; 
    for (String e : set3) { 
     count++; 
    } 
    assertEquals(3, count); 
    } 

이 문제는 당신의 반복자없는 내 LinkedSet

import java.util.Iterator; 

public class LinkedSet<E> implements Set<E> { 
    private LinkedNode<E> head = null; 
    private LinkedNode<E> link; 

    // Constructors 
    public LinkedSet() { 
    } 

    public LinkedSet(E e) { 
    this.head = new LinkedNode<E>(e, null); 
    } 

    private LinkedSet(LinkedNode<E> header) { 
    header = head; 

    } 

    @Override 
    public int size() { 
     int count = 0; 
    for(E e : this){ 
     count++;} 
    return count; 
    } 

    @Override 
    public boolean isEmpty() { 
    for(E e : this){ 
     if(e != null) 
      return false; 
    } 
     return true; 
    } 

    @Override 
    public LinkedNodeIterator<E> iterator() { 
    return new LinkedNodeIterator<E>(this.head); 
    } 

    @Override 
    public boolean contains(Object o) { 
    for(E e : this){ 
     if(e == o) 
      return true; 
    } 
    return false; 
    } 

    @Override 
    public boolean isSubset(Set<E> that) { 
     that = new LinkedSet<E>(); 
     if(this.size()>that.size()) 
      return false; 
    for(E e : this){ 
     if(that.contains(e) == false) 
      return false; 
    } 
    return true; 
    } 

    @Override 
    public boolean isSuperset(Set<E> that) { 
    that = new LinkedSet<E>(); 
    if(this.isSubset(that)) 
    return true; 
    else 
     return false; 
    } 

    @Override 
    public Set<E> adjoin(E e) { 
     boolean alwaysEqual = true; 
     if(this.head == null) 
      return this; 
    for(E t : this){ 
     if(t != e) 
      alwaysEqual = false;} 
    if(alwaysEqual == true) 
     return this; 
    LinkedNode<E> temp = this.head; 
    LinkedNode<E> newNode = new LinkedNode<E>(e, temp); 
    LinkedSet<E> newSet = new LinkedSet<E>(newNode); 
    Set<E> otherSet = newSet; 

    return otherSet; 
    } 

    @Override 
    public Set<E> union(Set<E> that) { 
     Set<E> thisSet = this; 
    for(E e : that){ 
     if(!this.contains(e)) 
      thisSet = thisSet.adjoin(e); 

    } 

    return thisSet; 
    } 

    @Override 
    public Set<E> intersect(Set<E> that) { 
     LinkedSet<E> newSet = null; 
     Set<E> otherNewSet = newSet; 
    for(E e : that){ 
     if(this.contains(e)){ 
      if(otherNewSet == null){ 
       LinkedNode<E> newNode = new LinkedNode<E>(e, null); 
       otherNewSet = new LinkedSet<E>(newNode); 
      } 
      else{ 

       otherNewSet = otherNewSet.adjoin(e); 
      } 

     } 
    } 

    return otherNewSet; 
    } 

    @Override 
    public Set<E> subtract(Set<E> that) { 
    LinkedSet<E> newSet = null; 
    Set<E> otherNewSet = newSet; 
    for(E e : that){ 
     if(!this.contains(e)){ 
      if(otherNewSet == null){ 
       LinkedNode<E> newNode = new LinkedNode<E>(e, null); 
       otherNewSet = new LinkedSet<E>(newNode); 
      } 
      else{ 

       otherNewSet = otherNewSet.adjoin(e); 
      } 

     } 
    } 

    return otherNewSet; 
     } 

    @Override 
    public Set<E> remove(E e) { 
     LinkedSet<E> newSet = null; 
     Set<E> otherNewSet = newSet; 
    if(!this.contains(e)) 
    return this; 
    else{ 
     for(E t : this){ 
      if(t != e){ 
       if(otherNewSet == null){ 
        LinkedNode<E> newNode = new LinkedNode<E>(e, null); 
        otherNewSet = new LinkedSet<E>(newNode); 
       } 
      } 
       else{ 

        otherNewSet = otherNewSet.adjoin(e); 
       } 
     } 
    } 
    return otherNewSet; 
    } 

    @Override 
    @SuppressWarnings("unchecked") 
    public boolean equals(Object o) { 
    if (! (o instanceof Set)) { 
     return false; 
    } 
    Set<E> that = (Set<E>)o; 
    return this.isSubset(that) && that.isSubset(this); 
    } 

    @Override 
    public int hashCode() { 
    int result = 0; 
    for (E e : this) { 
     result += e.hashCode(); 
    } 
    return result; 
    } 
} 
+3

아마도 실패한 테스트 사례의 예를 제시하는 것이 좋습니다. – javanut13

+0

디버거 사용 방법을 배우는 것이 좋습니다. 이 도구는 한 번에 한 줄의 코드를 실행하고 변수 값을 볼 수있게하여 도구가 무엇을 기대 한 것과 다른지를 볼 수있게 해주는 도구입니다. –

+0

불행히도, 우리는 쉽게 당신을 도울 충분한 정보를 제공하지 않았습니다. 테스트 케이스가 실패했을 때 (5 이외의 숫자를 부여합니까? 예외가 발생합니까? 등), 문제를 재현 할만큼 충분한 코드를 제공하지 않았습니다 (예 : LinkedSet에 대한 코드가 있음). 나는 추측을 할 수도 있지만 적절한 답을주기 위해 더 많은 작업이 필요합니다. – Tim

답변

0

에 대한 코드입니다, 귀하의 adjoin 방법입니다.

이 같은 새로운 LinkedSet를 구성하는 경우 :

set1 = new LinkedSet<String>(); 

그것은 당신이 생성자 호출을 의미합니다 :

// Constructors 
    public LinkedSet() { 
    } 

을하지만 생성자 head에 아무것도 지정하지 않기 때문에이있다 그 기본 초기 값 :

private LinkedNode<E> head = null; 

인스 head이 방법은 반환 this 아무것도하지만하지 않습니다 결코 null로 시작합니다, 그리고 지금에 할당되지 않은 :

@Override 
public Set<E> adjoin(E e) { 
    boolean alwaysEqual = true; 
    if (this.head == null) 
     return this; 
    for (E t : this) { 
     if (t != e) 
      alwaysEqual = false; 
    } 
    if (alwaysEqual == true) 
     return this; 
    LinkedNode<E> temp = this.head; 
    LinkedNode<E> newNode = new LinkedNode<E>(e, temp); 
    LinkedSet<E> newSet = new LinkedSet<E>(newNode); 
    Set<E> otherSet = newSet; 

    return otherSet; 
} 

그래서 당신의 반복자 아무것도 반복되지 않으며, 사용자의 설정 그것에 아무 상관이 없기 때문입니다.

+0

감사합니다. 너무 많은 의미가 있습니다 –

+0

아무런 문제는 없지만 대답을 이해한다면 대답의 왼쪽에있는 체크를 클릭하여 "받아 들여야"합니다. – Tim

0
  1. 이 코드는 curr이 null 인 경우 NullPointerException을 보장합니다.

    (curr.getNext()는 == null이 || CURR == NULL)

실행은 왼쪽에서 오른쪽으로되어있는 경우. 역 참조를 시도하기 전에 null에 대한 참조를 테스트하십시오.

관련 문제