2015-02-22 2 views
0

Я работаю над заданием, и в настоящее время я застрял в попытке пройти через свой массив сверху вниз. Этот массив основан на # 1, поэтому он начинается с 1, а не 0.Как я могу пройти назад в своем неупорядоченном массиве?

Чтобы проверить мой итератор, я сделал сопроводительный обратный метод, который проходит через массив из currentSize и gos вниз по массиву, распечатывая каждый объект в Это. Но, похоже, этот метод не выполняется. Я предполагаю, что с моим итератором может быть что-то не так, или я пишу свой обратный метод.

Ультиматули, мне нужно, чтобы массив мог возвращаться назад, когда тестер вызывает итератор.

Вот как вещи добавляются в массив:

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) 
+0

Ваш метод обратного списка выводит только индекс, а не любое значение этого индекса. –

+0

@BrettOkken спасибо за указание, я просто изменил его. Но все же никаких изменений в поведении. –

+0

Ваш обратный список не делает ничего, кроме распечатки. Это фактически не отменяет порядок записей. –

ответ

0

в своем коде, когда travering в обратном направлении, то кажется, что ваше для цикла не является правильным. Я предполагаю, что это должно быть i >= 0 вместо i<=1, что никогда не бывает правдой. Кроме того, вы должны, вероятно, распечатать что-то большее, чем i, которое является только индексом.

public void reverseList() { 

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

} 

Еще одно место в коде, где вы поменялись < и >

Кроме того, этот код будет установлен для хранения [2] = хранение [1], хранение [3] = хранение [2] и т.д. , что означает хранение [i] = хранилище [1] для всех i. Фундаментальная ошибка. Вероятно, это должно быть примерно так:

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

Хороший вопрос! Я случайно переключил знак меньше и больше, но точка останова должна быть 1, потому что индекс 0 не используется в этой программе. Я также переключил печать, чтобы распечатать объект по индексу. Но теперь элементы печатают 9 нулевых объектов и 10. Когда перед обратным методом выполняется, в массив добавляется 10 объектов. –

+0

@ShermanBachar Хорошо, рад, что помог. Что вы печатаете вместо i внутри цикла for? я полагаю? – knordbo

+0

@ShermanBachar Можете ли вы показать нам код метода .showMe(), поскольку он может сделать что-то неподходящее перед обратным вызовом. – knordbo

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++; 
} 
+0

Что такое часть System.arrayCopy? –

+0

Он копирует содержимое из существующего массива в новый массив. Прочтите связанный javadoc, как работает этот метод. –

+0

для этого задания, мне нужно вручную скопировать массивы в новый массив, я разместил здесь весь свой код на pastebin: pastebin.com/qFDh5upS и тестер можно найти здесь: pastebin.com/K9Mqkjm9 –

 Смежные вопросы

  • Нет связанных вопросов^_^