无论出于何种原因,当我运行我的程序时,我的指数超出范围'我的整数列表的错误,尽管事实上我使用了与此函数类似的代码,但它工作正常。我不确定我错过了什么,有人可以帮忙吗?
以下是代码:
public void Histogram() //Function that creates a histogram
{
List<int> histo = new List<int>();
int histogram;
int a = 1;
int z = 5;
//userNumber is a list containing a set of integers
for ( int x = 0; x < userNumber.Count; x++)
{
histogram = userNumber[x];
if (histogram >= a && histogram <= z)
{
histo[x] += 1; //This is where the error occurs
}
else
{
a += 5;
z += 5;
histo.Add(1);
}
}
a = 1;
z = 5;
for( int h = 0; h < histo.Count; h++)
{
histogram = h;
Console.Write("{0} - {1} ", a, z);
for (int x = 0; x < histogram; x++)
{
Console.Write("*");
}
a += 5;
z += 5;
Console.WriteLine("\n");
}
}
答案 0 :(得分:4)
这一行可能抛出异常:
histo[x] += 1;
您的列表hist
中没有任何整数,或者您尝试访问的索引高于列表中的项目。因此抛出异常....
答案 1 :(得分:2)
问题是您尚未正确初始化histo
以用于索引:它具有零元素,因此您无法使用x
对其进行索引。
立即用一个元素初始化你的列表,像这样,
List<int> histo = new List<int> { 0 };
并替换
histo[x] += 1
与
histo[histogram / 5] += 1
解决此问题。
我添加了除以5的除法,因为每次遇到不符合直方图的数字时,你的边界似乎都会增加5。
您还应该从构建直方图的代码中删除z += 5;
:您应该扩展范围,而不是将其向上移动5。
更好的方法是预先调整histo
的大小,并在第一个循环中跳过修改a
和z
:
List<int> histo = new List<int>(Enumerable.Range(0, userNumber.Max() / 5));
foreach (var h in userNumber) {
histo[h/5]++;
}
// Print your histogram in the usual way
答案 2 :(得分:1)
错误的原因是您尝试从空列表中读取:
// histo doesn't have any items at all: histo.Count == 0
List<int> histo = new List<int>();
...
// You're trying to read a non existing item (histo doesn't have any items)
histo[x] += 1;
可能的修改:
// histo has userNumber.Count items which are equal to 0
List<int> histo = new int[userNumber.Count].ToList();
答案 3 :(得分:0)
假设第一个userNumber属于此代码:
if (histogram >= a && histogram <= z)
{
histo[x] += 1; //This is where the error occurs
}
你从未在histo
中添加一个数字,因此它会使Index超出范围,因为histo
为空。
为避免这种情况,在使用此类访问者之前,您必须确保Add
。