如何修复制作直方图时列表索引超出范围的异常
本文关键字:范围 异常 索引 列表 复制 何修 直方图 | 更新日期: 2023-09-27 18:25:45
无论出于何种原因,当我运行程序时,我的整数列表会出现"索引超出范围"错误,尽管我使用了与此函数类似的代码,而且它运行良好。我不知道我错过了什么,有人能帮忙吗?
这是代码:
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");
}
}
可能这一行抛出异常:
histo[x] += 1;
您的列表hist
中没有任何整数,或者您正试图访问高于列表中项目数的索引。正因为如此,才会引发异常。。。。
问题是您没有正确初始化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
错误的原因是您试图从空列表中读取:
// 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();
假设第一个userNumber属于以下代码:
if (histogram >= a && histogram <= z)
{
histo[x] += 1; //This is where the error occurs
}
您从未在histo
中添加数字,因此它将抛出Index Out of Range,因为histo
为空。
为了避免这种情况,您必须确保在使用此类访问者之前Add
任何内容。