2015-05-27 5 views
2

Я пытаюсь получить элемент в определенном индексе с помощью метода:Почему it.current меняет свои значения во время отладки?

public T GetElem(int index) 
{ 
    var it = outerInstance.iterator(); 
    var i = 0; 
    while (it.MoveNext() && i < index) 
    { 
     i++; 
    } 
    return it.Current; 
} 

Я создал свой собственный итератор, который является внутренним классом outerInstance, во время отладки текущего элемента уменьшается в конце он становится нулевым.

Мой тест это внутри консольного приложения и выглядит следующим образом:

Storage<int?> storage = new DynSLinkedList<int?>(); 
var ranked = new Ranked<int?>(storage); 

if (ranked.IsEmpty()) 
{ 
    Console.WriteLine("is empty \n"); 
} 

for (var i = 1; i <= 10; i++) 
    ranked.Add(i); 

if (!ranked.IsEmpty()) 
{ 
    Console.WriteLine("is not empty \n"); 
} 

if (ranked.Size() == 10) 
{ 
    Console.WriteLine("Size ok \n"); 
} 

for (var i = 0; i <= 9; i++) 
{ 
    var element = ranked.GetElem(i); 
    if (element == 10 - i) 
    { 
     Console.WriteLine("get " + i + " elem ok \n"); 
    } 
} 

только при г = 0 он получает право.

enter image description here

enter image description here

Я попытался написать эквивалент для метода Java:

@Override 
public T getElem(int index) throws IndexOutOfBoundsException { 
    RWIterator<T> it=support.iterator(); 
    int i=0; 
    while (it.hasNext() && i<index){ 
     it.next(); 
     i++; 
    } 
    return it.next(); 
} 
+1

Так что же ваш итератор выглядеть? Что выглядит 'Ranked '? –

ответ

2

Ваша проблема заключается в том, что вы используете один экземпляр перебрать в ранжированном. Метод GetElem. В первый раз, когда вы вызываете ranked.GetElem, передавая 0, итератор будет перемещен на один шаг (it.MoveNext).

В этот момент итератор уже указывает на второй элемент в вашем списке. В следующий раз, когда вы назовете rank.GetElem, пройдя 1, итератор будет перемещен на два расстояния дальше, в результате чего будет возвращен третий элемент, а не тот, который вы ожидаете (второй). Так далее и тому подобное.

Вам необходимо либо изменить общий подход, который вы принимаете, либо сбросить итератор внутри метода GetElem, чтобы он всегда начинался с первого элемента.

Попробуйте (если вы реализуете Reset() метод правильно):

public T GetElem(int index) 
{ 
    var it = outerInstance.iterator(); 
    it.Reset(); 
    var i = 0; 
    while (it.MoveNext() && i < index) 
    { 
     i++; 
    } 
    return it.Current; 
} 
+0

спасибо .. кажется, что я не реализовал правильный метод сброса – David

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