如何修复制作直方图时列表索引超出范围的异常

本文关键字:范围 异常 索引 列表 复制 何修 直方图 | 更新日期: 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的大小,并跳过在第一个循环中修改az

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任何内容。