0

我正在处理一项任务,我目前正试图从上到下遍历我的阵列。这个数组是基于 #1 的,因此它从 1 而不是 0 开始。

为了测试我的迭代器,我做了一个附带的反向方法,它从 currentSize 遍历数组并沿着数组向下移动,打印出其中的每个对象。但它似乎没有执行该方法。我假设我的迭代器可能有问题,或者我编写反向方法的方式可能有问题。

最后,当测试器调用迭代器时,我需要数组能够向后遍历。

这是将事物添加到数组中的方式:

public void addFirst(E obj) {
    if(currentSize==maxSize)
        growStrorage();

    if(isEmpty())
        storage[1]=obj;

    for(int i=1; i>currentSize+1; i++){
        storage[i+1]=storage[i];
    }

    storage[1]=obj;
    modCounter++;
    currentSize++;
}

这是相反的方法(这是作为一种测试方法来帮助解决我的问题):

public void reverseList() {

        for(int i=currentSize; i>=1;i--)
            System.out.println(storage[i]);


    }

这是我要求的 showMe 方法(这也是作为测试方法来帮助解决我的问题):

public void showMe(){

    for(int i=1; i<=currentSize; i++)
        System.out.print(i+" ");


}

这是我的迭代器:

    public Iterator<E> iterator() {
    return new IteratorHelper();
}

private class IteratorHelper <E>implements Iterator <E>{

    private int iterIndex;
    long stateCheck;

    public IteratorHelper(){
        iterIndex=1;
        stateCheck=modCounter;
    }

    public boolean hasNext(){
        if(stateCheck !=modCounter){
            throw new ConcurrentModificationException();
        }

        return iterIndex<=currentSize;
    }

    public E next(){
        if(!hasNext())
            throw new NoSuchElementException();

            return (E)storage[iterIndex++];

    }

这是测试仪:

 for(int i=1; i <= 10; i++)
        list.addFirst(new Integer(i));  
    System.out.println("Current size of list: (should be 10)" 
        + list.size()); 

 //My code 
   System.out.println("Now showing what is in Array..");
       list.showMe();
       System.out.println("\n");  
   System.out.println("Now reversing Array..");
    list.reverseList();


  *******  System.out.println("Now using the iterator, should print " *******
        + "10 .. 1");            
    for(int x : list)
        System.out.print(x + " ");
    System.out.println(); 

****** == 我的代码有问题的地方

这是打印:

 Should print 1 .. 10
  1 2 3 4 5 6 7 8 9 10 

   Now removing them all
   Current size of list: (should be zero) 0
    Current size of list: (should be 10)10
   Now showing what is in Array..
   1 2 3 4 5 6 7 8 9 10 

   Now reversing Array..
   null
   null
   null
   null
   null
   null
   null
   null
   null
   10
  Now using the iterator, should print 10 .. 1
  10 ERROR java.lang.NullPointerException
  java.lang.NullPointerException
    at data_structures.P1Tester.runTests(P1Tester.java:49)
    at data_structures.P1Tester.<init>(P1Tester.java:14)
    at data_structures.P1Tester.main(P1Tester.java:103)
4

2 回答 2

0

在您的代码中,当反向遍历时,您的 for 循环似乎不正确。我假设它应该是i >= 0,而不是i<=1它永远不会是真的。此外,您可能应该打印出更多的东西i,而不仅仅是索引。

public void reverseList() {

    for(int i=currentSize; i >= 0;i--)
        System.out.println(i);

}

代码中您已交换的另一个<位置>

此外,此代码将设置 storage[2] = storage[1]、storage[3] = storage[2] 等,这意味着所有 i 的 storage[i] = storage[1]。基本错误。它可能应该是这样的:

for(int i = currentSize; i >= 1; i++){
    storage[i+1]=storage[i];
}
于 2015-02-22T00:53:27.250 回答
0

问题在于您如何处理 addFirst 方法中的现有内容以及使用 growStorage。

public void addFirst(E obj) {
    if(currentSize==maxSize)
        growStrorage();

    if(isEmpty())
        storage[1]=obj;

    for(int i=1; i>currentSize+1; i++){
        storage[i+1]=storage[i];
    }

    storage[1]=obj;
    modCounter++;
    currentSize++;
}

复制存储时,必须保留对当前存储的引用才能复制当前内容。您还应该使用System.arrayCopy而不是手动复制内容。就像是:

/**
 * Grows the backing storage and optionally shifts all the content
 * when copying to new array.
 */
private void growStorage(int shift) {
    final Object[] current = storage;
    //double current size
    storage = new Object[current.length * 2];
    maxSize = storage.length;

    System.arrayCopy(current, 0, storage, shift, current.length);
}

public void addFirst(E obj) {
    if(currentSize==maxSize)
        growStrorage(1);

    storage[1]=obj;

    modCounter++;
    currentSize++;
}
于 2015-02-22T01:13:58.990 回答