为什么 it.current 在调试期间更改他的值?
Why is it.current changing his values during debug?
我正在尝试使用以下方法获取特定索引处的元素:
public T GetElem(int index)
{
var it = outerInstance.iterator();
var i = 0;
while (it.MoveNext() && i < index)
{
i++;
}
return it.Current;
}
我创建了自己的迭代器,它是 outerInstance 的内部 class,在调试过程中,当前元素正在减少,最后变为 null。
我的测试是在控制台应用程序中进行的,如下所示:
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");
}
}
只有 i=0 才正确。
我已经尝试为 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();
}
您的问题是您在 Ranked.GetElem 方法中使用单个实例进行迭代。第一次调用 ranked.GetElem 时,传递 0,迭代器将移动一步 (it.MoveNext)。
此时迭代器已经指向列表中的第二个元素。下次调用 ranked.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;
}
我正在尝试使用以下方法获取特定索引处的元素:
public T GetElem(int index)
{
var it = outerInstance.iterator();
var i = 0;
while (it.MoveNext() && i < index)
{
i++;
}
return it.Current;
}
我创建了自己的迭代器,它是 outerInstance 的内部 class,在调试过程中,当前元素正在减少,最后变为 null。
我的测试是在控制台应用程序中进行的,如下所示:
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");
}
}
只有 i=0 才正确。
我已经尝试为 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();
}
您的问题是您在 Ranked.GetElem 方法中使用单个实例进行迭代。第一次调用 ranked.GetElem 时,传递 0,迭代器将移动一步 (it.MoveNext)。
此时迭代器已经指向列表中的第二个元素。下次调用 ranked.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;
}