如何修复索引超出数组界限的错误



我试图访问一个数组元素,并对其进行一些逻辑门操作,所以基本上我试图获取每个元素的邻居,但我得到了错误,索引超出了数组错误的范围。。这是我的一个条件if语句,我知道我正在尝试访问一个不存在的元素,该元素要么小于0元素位置,要么大于或=array.length

public static int[] cellCompete(int[] states, int days)
{
int counter = 0;
// INSERT YOUR CODE HERE
while (counter <= days)
{
for (int i = 0; i < states.Length; i++)
{
if(i < states.Length - 1 || i > states[0])
{
if (states[0] == 0 && states[i + 1] == 0)
{
states[i - 1] = 0;
}
if (states[0] == 0 && states[i + 1] == 1)
{
states[i - 1] = 1;
}
if (states[i] == states.Length - 1 && states[i - 1] == 0)
{
states[i] = 0;
}
if (states[i] == states.Length - 1 && states[i - 1] == 1)
{
states[i] = 1;
}
if (states[i + 1] == 0 && states[i - 1] == 0)
{
states[i] = 0;
}
if (states[i + 1] == 0 && states[i - 1] == 1)
{
states[i] = 1;
}
if (states[i + 1] == 1 && states[i - 1] == 0)
{
states[i] = 1;
}
if (states[i + 1] == 1 && states[i - 1] == 1)
{
states[i] = 0;
}
}
}
counter++;
}
return states;
}

知道怎么修吗?

如果在循环中执行此操作,请确保i不是<0且不超过"阵列大小-1">

然后你可以安全地使用i作为数组索引

我假设你在一个循环中做这项工作,它看起来像:

for (int i = 0; i < states.Length; i++)
{
if (states[i] == 0 && states[i + 1] == 0)
{
states[i] = 0;
}
}

如果是这样的话,那么你要做的是比较数组中的成对事物,那么传统的方法是缓存第一个,然后从1->n-1循环。例如:

var previousState = states[0];
for (int i = 1; i < states.Length; i++)
{
if (previousState == 0 && states[i] == 0)
{
states[i -1] = 0;
}
}

当您声明一个数组时,您可以指定大小。也就是说,它可以容纳的最大项目数。所以,

int[] states = new int[2];

意味着状态数组最多可容纳2个项目。因此,以下将是有效的,不会抛出上述异常:

var one = states[0];
var two = states[1];

但这会的,因为它最多只能容纳2个项目,但你正试图访问第三个项目。

var three = states[2];

因此,在循环中,您应该确保始终检查有效范围。所以,如果你想检查当前项目和下一个项目,你的循环应该只进入有效范围:

for (int i = 0; i < states.Length - 1; i++)
{
if (states[i] == 1 && states[i + 1] == 1)
{
// Do something
}
}

条件i < states.Length - 1(注意-1(确保您永远不会超出有效范围。


编辑

上面的循环将只从第一个元素迭代到最后一个元素之前的元素。如果你想遍历它们,但只想检查最后一个之前的项目的上述条件,那么你可以添加一个额外的条件来防止最后出现超出范围的异常:

for (int i = 0; i < states.Length; i++)
{
if (i < states.Length - 1)
{
if (states[i] == 1 && states[i + 1] == 1)
{
// Do something
}
}
}

编辑2

查看您更新的帖子,我认为您的if条件需要更改为:

if(i < states.Length - 1 && i > 0)

最新更新