2012-03-09 122 views
0

这是我不明白的,而我的教授本周很忙,所以我不能问她。有人可以向我解释如何设置列表迭代器,并使用它来返回ArrayList中的元素?谢谢。它是“公共Iterator迭代器()”的方法,我已经尽力了,但我无法完成它。如何返回列表中元素的列表迭代器

public class ArrayList<E> implements List<E> { 
private E[] elementData; 
private int elementCount; 
private int capacityIncrement; 
private static final int INVALID_INDEX=-1; 
private static final int DEFAULT_CAPACITY = 100; 

public ArrayList() { 

    capacityIncrement = 0; 
    elementData = (E[]) new Object[DEFAULT_CAPACITY]; 


} 

public ArrayList(int capacity) { 

    this.capacityIncrement = 0; 
    this.elementData = (E[]) new Object[capacity]; 


} 

public ArrayList(int capacity, int increment) { 

    this.capacityIncrement = increment; 
    this.elementData = (E[]) new Object[capacity]; 

} 

public int size() { 
    return elementCount; 

} 

public boolean isEmpty() { 
    if (elementCount != 0) return false; 
    else return true; 
} 

public void clear() { 
     elementCount = 0; 

} 

public boolean contains(E element) { //check back 
    for (int i = 0; i < elementCount; i++) { 
     if (elementData[i].equals(element)) return true; //== vs. .equals 
    } 
    return false; 
} 

public void add(E element) { 
    elementCount++; 
    elementData[elementCount] = element; 
} 

public boolean remove(E element) { 
    for (int i = 0; i < elementCount; i++) { //while vs. loop 
     if (elementData[i].equals(element)) { 
      for (int j = 0; j <= (elementCount - i); j++){ 
      elementData[i] = elementData[i++]; 
      elementCount = elementCount - 1; 
      return true; 
      } 


     } 

    } 
    return false; 
} 

public E elementAt(int index) { 

    return elementData[index]; //elementdata vs. elementcount 
} 

public int indexOf(E element) { 


    for (int i = 0; i < elementCount; i++) //while vs. loop 
     if (elementData[i].equals(element)) { 
      return i; 

     } return INVALID_INDEX; 


} 

public void insertElementAt(E element, int index) { 
    elementCount = elementCount + 1; 
    for (int i = index; i < elementCount; i++) { 
     elementData[i++] = elementData[i]; 
    } 
    elementData[index] = element; 
    //shift right (look at notes) 
} 

public void removeElementAt(int index) { 
    for (int i = index; i < elementCount; i++) { 
     elementData[i] = elementData[i++]; 

    } 
    elementCount = elementCount - 1; 
} 

public void setElementAt(E element, int index) { 

    elementData[index] = element; 
} 

public void removeDuplicates() { 

    for (int i = 0; i < elementCount; i++) { 
     for (int j = 0; j < elementCount; j++) { 
      if (elementData[i].equals(elementData[j])) { 
       elementData[i] = elementData[i++]; 
       elementCount = elementCount - 1; 
      } 
     } 
    } 
} 

public void trimToSize() { //don't need to add trims to removing methods?? 



} 

public Iterator<E> iterator() { 
    Iterator itr = new list.iterator(); 
    while (itr.hasNext()) { 

    } 
    /** 
* 
* @return a list iterator of the elements 
* in this list (in proper sequence). 
*/ 

} 

public Iterator<E> iterator(int index) { 
    throw new UnsupportedOperationException("Not supported yet."); 
} 



private static class ArrayListIterator<E> implements Iterator<E> { 
    private ArrayListIterator(ArrayList c) { 
     /** 
     * Returns a list iterator of the elements in this list (in proper sequence). 
     * @param c list to be iterated upon 
     */ 
     elementData=c; 

    } 


} 

} 

回答

1

迭代器只是一个指定实现类必须提供next()和hasNext()的接口。

一个简单的第一次切割实现将使您的数组列表实现Iterator接口。

你会添加一个 “CURRENTINDEX” 部件和像

Iterator<E> iterator() { return this; } 

next()和hasNext(方法)将使用CURRENTINDEX和阵列尺寸适当。

这显然打破了,如果你想拥有在同一采集多个迭代器,所以下一步将重构迭代器的东西到一个单独的类。

0

在您的public Iterator iterator()方法中,您正在返回一个迭代器。所以

public Iterator<E> iterator() { 
    return this.iterator(); 
} 

会做这项工作。

+0

buut我必须返回一个列表的元素,没有我需要一个while循环呢? – IC2D 2012-03-09 05:13:45

+0

'public Iterator iterator()''是来自'List'接口的覆盖。所以你不能改变方法签名。 – John 2012-03-09 05:33:58

+0

在您创建Arraylist对象的主程序中。你可以获得该对象的迭代器,然后遍历它的元素。 – John 2012-03-09 05:36:39