2017-03-05 61 views
0

我创建了一个自定义链接列表。我也为它做了一个迭代器。但是,我明白,程序没有在方法size()中循环。它出什么问题了?是关于我的不正确的循环或iterator()。每个节点都有字段:nextIndex,prevIndex,value链接列表的自定义迭代器

public class CustomLinkedList<E> implements List<E>{ 
    private ListNode<E> header = new ListNode<>(); 

    public CustomLinkedList() { 
     this.header = new ListNode(); 
    } 

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

    @Override 
    public boolean isEmpty() { 
     if(this.header == null){ 
      return true; 
     } else {return false;} 
    } 

    @Override 
    public boolean contains(Object o) { 
     if(((Integer) header.getValue() == 42) && ((Integer) header.getNextIndex().getValue() == 38)) return true; 
     return false; 
    } 

    @Override 
    public Iterator<E> iterator() { 
     return new Iterator<E>() { 
      private ListNode it = header; 

      @Override 
      public boolean hasNext() { 
       return (it.getNextIndex() != header) && (it.getNextIndex() != null); 
      } 

      @Override 
      public E next() { 
       it = it.getNextIndex(); 
       return (E) it.getValue(); 
      } 

      @Override 
      public void remove() 
      { 
       throw new UnsupportedOperationException("Iterator is read-only"); 
      } 
     }; 
    } 


    @Override 
    public boolean add(E e) { 
     ListNode<E> temp = new ListNode<>(); 
     temp.setValue(e); 
     if (this.size() < 1) { 
      header.setValue(e); 
      header.setPrevIndex(header); 
      header.setNextIndex(header); 
     } else { 
      temp.setNextIndex(header); 
      ListNode tempLast = header.getPrevIndex(); 
      tempLast.setNextIndex(temp); 
      header.setPrevIndex(temp); 
      temp.setPrevIndex(tempLast); 
     } 
     return true; 
    } 

    @Override 
    public boolean remove(Object o) { 
     return true; 
    } 

    @Override 
    public boolean containsAll(Collection<?> c) { 
     throw new NotImplementedException(); 
    } 

    @Override 
    public void clear() { 
     throw new NotImplementedException(); 
    } 

    @Override 
    public E get(int index) { 
     throw new NotImplementedException(); 
    } 

    @Override 
    public int indexOf(Object o) { 
     throw new NotImplementedException(); 
    } 

    @Override 
    public boolean addAll(Collection<? extends E> c) { 
     throw new NotImplementedException(); 
    } 
} 

回答

1

你开始header.getNextIndex() == null然后调用add(E e)一次。 里面add()size()将返回0,因此设置header.setPrevIndex(header)header.setNextIndex(header)

接下来你叫add(E e)再次. Inside的add(),大小()will call hasNext()and hasNext()will check (it.getNextIndex() != header) && (it.getNextIndex() != null)将返回因为it.getNextIndex() == header 因此size()将始终小于一个

而且你的代码还有很多其他的bug。一个更好的部分实现将会像

public class CustomLinkedList<E> implements List<E> { 

    private ListNode<E> header; 

    public CustomLinkedList() { 
     this.header = null; 
    } 

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

    @Override 
    public boolean isEmpty() { 
     return header == null; 
    } 

    @Override 
    public boolean contains(Object obj) { 
     if (header != null) 
      for (E it : this) 
       if (it.equals(obj)) 
        return true; 
     return false; 
    } 

    @Override 
    public Iterator<E> iterator() { 
     return new Iterator<E>() { 
      private ListNode<E> it = null; 

      @Override 
      public boolean hasNext() { 
       if (it==null && header!=null) 
        return true; 
       else if (it != null) 
        return it.getNextIndex() != null; 
       else 
        return false; 
      } 

      @Override 
      public E next() { 
       if (it==null) 
        it = header; 
       else 
        it = it.getNextIndex(); 
       return it.getValue(); 
      } 

      @Override 
      public void remove() { 
       throw new UnsupportedOperationException("Iterator is read-only"); 
      } 
     }; 
    } 

    @Override 
    public boolean add(E e) { 
     ListNode<E> temp = new ListNode<>(); 
     temp.setValue(e); 
     if (header == null) { 
      header = temp; 
     } else { 
      ListNode<E> it = header; 
      while (it.getNextIndex() != null) 
       it = it.getNextIndex(); 
      temp.setPrevIndex(it); 
      it.setNextIndex(temp); 
     } 
     return true; 
    } 

} 
+0

如何改进它以在for的第一次迭代中获取header.value?现在它不。因为在第一次迭代中,我们得到了header.getNextIndex()。getValue()。 – Russiancold

+1

是的,你是对的。我编辑了hasNext()中的代码和它的初始化,但没有对它进行测试。我认为现在没问题。 –

+0

非常感谢。 – Russiancold

0

您需要通过元素使用的iteratorhasNextnext方法循环,​​并增加了尺寸,例如:

@Override 
public int size() { 
    int size = 0; 
    for(Iterator<String> it = this.iterator(); it.hasNext(); it.next()){ 
     size++; 
    } 
    return size; 
} 
+0

它仍然没有进入循环。所以问题是不正确的加入或hasNext()。对? – Russiancold

+0

如果它没有进入循环,那么你的列表可能是空的。 –

+0

它不会进入循环内,因为add()方法是错误的。阅读我的解释为什么在另一个答案。 –