我一直被困在IndexOutOfBoundsException
上,我无法弄明白,我不明白为什么它指向我的while
循环。有关该怎么办的任何建议?方法btw是一个循环调度模拟器,它似乎与我的一个测试文件完美配合而不是另一个。
public void roundRobin2(ArrayList<Jobs> c, int startSize)
{
//int n = 0;
double counter = 0;
double compTime = 0;
while(!c.isEmpty())
{
int i = 0;
System.out.println(c);
for(i = 0; i < c.size(); i++)
{
if((c.get(i).jobTime) >= 2)
{
c.get(i).jobTime -= 2;
counter += 2;
if((c.get(i).jobTime) == 0)
{
compTime += counter;
}
}
else
{
(c.get(i).jobTime) -= 1;
counter += 1;
if((c.get(i).jobTime) == 0)
{
compTime += counter;
}
}
//System.out.print("-" + c.get(i).jobName + "-" + counter);
//n++;
//if(n%10 == 0)
//{
//System.out.println("\n");
//}
}
for(i = 0; i < c.size(); i++)
{
while(!c.isEmpty() && (c.get(i).jobTime) == 0)
{
c.remove(i);
}
}
}
System.out.println("\n\nAverage completion times: "+ compTime + "/" + startSize +" = " + ((compTime)/startSize));
}
异常堆栈跟踪:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 7, Size: 7
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at cs431.edu.cpp.Main.roundRobin2(Main.java:143)
答案 0 :(得分:1)
您正在删除正在迭代的集合中的项目,这非常糟糕,您永远不应该这样做。您可以使用具有For Each Control In Me.Controls
If Control.GetType() Is GetType(TextBox) Then
CType(Control, TextBox).Clear
End If
Next
方法的Iterator
来执行此操作(但这很少有效),或者为您的集合制作临时副本。顺便说一句,循环法可以更容易实现。
此解决方案使用remove
,因为头部的移除和末尾的插入都是LinkedList
,这是高效且安全的。我还压缩了你的一些逻辑作为奖励:
O(1)