Возникли проблемы при создании случайных значений - PullRequest
0 голосов
/ 30 марта 2020

Итак, я создал класс Pairs, который содержит int и double, и я хочу создать их массив с моим классом массива путем создания случайных значений, но я получаю исключение System.NullReferenceException в строке 19 моего класса массива.

Вот мой класс пары

class Pair
{

    public int integer = 0;
    public double doubl = 0.0;

    public Pair(int integer, double doubl)
    {
        this.integer = integer;
        this.doubl = doubl;
    }

    public Pair()
    {

    }
    public int Integer() { return integer; }
    public double Doubl() { return doubl; }
}

А это мой класс массива и абстрактный класс

class MyDataArray : DataArray
{

    Pair[] data;
    int operations = 0;

    public MyDataArray(int n, int seed)
    {
        data = new Pair[n];
        Random rand = new Random(seed);
        for (int i = 0; i < n; i++)
        {
            data[i].integer = rand.Next(); //I get error here
            data[i].doubl = rand.NextDouble();

        }

    }

    public int integer(int index)
    {
        return data[index].integer;

    }

    public double doubl(int index)
    {
        return data[index].doubl;
    }
}

abstract class DataArray
{

    public int operations { get; set; }
    public abstract void Swap(int i, int j);
    public abstract void Swap2(int i, int high);
}

Также стоит ли использовать этот абстрактный класс, я использовал это из Ссылка, которую предоставил мой университет. Мне нужно создать алгоритм быстрой сортировки, который сортирует пары в массивах и связанных списках и анализирует его.

Ответы [ 2 ]

2 голосов
/ 30 марта 2020
data = new Pair[n];

Это создает новый массив пустых ссылок .

Значение l oop должно быть

    for (int i = 0; i < n; i++)
    {
        data[i] = new Pair(rand.Next(), rand.NextDouble())
    }

Пока мы смотрим на ваш код Вы делаете хорошую попытку создать неизменную пару, но это может быть и лучше. То, что вы хотите:

class Pair
{
    public Pair(int integer, double doubl)
    {
        this.Integer = integer;
        this.Double = doubl;
    }

    public int Integer { get; private set; }
    public double Double { get; private set; }
}

Короче, безопаснее, чище.

0 голосов
/ 30 марта 2020

Проблема с вашим кодом заключается в том, что вы инициализируете массив данных только в MyDataArray. При создании массива экземпляров он только инициализирует ссылки для массива, а не фактические экземпляры, которые должны быть в массиве. Все эти ссылки указывают на ноль. Поэтому, когда вы пытаетесь установить целочисленный элемент экземпляра i-й пары в массиве данных:

...
data[i].integer = rand.Next();
...

Вы на самом деле пытаетесь установить целочисленный элемент null, который не существует.

...
null.integer = rand.Next();
...

Чтобы это исправить, просто создайте новый экземпляр Pair для каждого индекса данных в вашем l oop.

...
for (int i = 0; i < n; i++)
{
    data[i] = new Pair();
    data[i].integer = rand.Next();
    data[i].doubl = rand.NextDouble();

}
...

Еще лучше, вы можете использовать конструктор, который вы сделано там, где нужны параметры для установки целого числа и удвоения при построении для упрощения кода в вашем l oop.

...
for (int i = 0; i < n; i++)
{
    data[i] = new Pair(rand.Next(), rand.NextDouble());
}
...
...