Нужна помощь в понимании структуры этого метода вставки - PullRequest
0 голосов
/ 07 февраля 2019

Я работаю над домашним заданием, включающим методы сортировки массивов, нам даны методы, и у меня возникли небольшие проблемы с пониманием того, как работает этот метод сортировки вставками.Более конкретно, роль, которую две переменные передают методу.

Как я понимаю, переменная Key описывает индекс массива, в который вы хотите поместить вставленный номер, а элемент - это номер.сам.В рамках main я просто прошу пользователя ввести два числа и передать их методу, один для ключа, а другой для элемента.Вот код для этого сегмента:

public final void insertion(double Key, double Item)
{
    if (arraySize == 0)
    {
        arr[0] = Item;
    }
    /* find the position for inserting the given item */
    int position = 0;
    while (position < arraySize &  Key > arr[position])
    {
        position++;
    }
    for (int i = arraySize; i > position; i--)
    {
        arr[i] = arr[i - 1];
    }
    arr[position] = Item;
    arraySize = arraySize + 1;

}

Однако, когда я передаю удваивается методу, как я объяснил, я получаю сообщение об ошибке, указывающее, что индекс (длина массива) выходит за пределы длины (длина массива).

Очевидно, я неправильно понимаю цель или структуру этого метода и не могу понять это.Любая помощь будет оценена.Я знаю, что это очень простая проблема.

РЕДАКТИРОВАТЬ: Вот как я инициализирую свой массив, данный код находится в отдельном классе от моего основного метода:

    public static double[] arr;
    private int arraySize;

    public sortedArrayAccess(int scale)
    {
        arr = new double[scale];
        arraySize = arr.length;
    }

Внутри моего основногометод:

    System.out.print("Enter an array size: ");
    int d = sc.nextInt();
    sortedArrayAccess test = new sortedArrayAccess(d);
    for(int i=0;i<test.arr.length;i++)
        {
        System.out.print("Enter a number for index " + i + ": ");
        double c = sc.nextDouble();
        test.arr[i] = c;
        }

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

Ваша проблема здесь:

if (arraySize == 0)
{
    arr[0] = Item;
}

Вы назначаете Элемент первому элементу в массиве.Но размер массива должен быть пустым, как указано в if (arraySize == 0)

Таким образом, у вас есть два варианта:

  • настроить размер массива (путем создания нового)
  • или верните ошибку
0 голосов
/ 07 февраля 2019
if (arraySize == 0)
    {
        arr[0] = Item;
    }

Как вы знаете, в информатике индексы начинаются с 0. Это означает, что arr [0] - это первый слот вашего массива.если arraySize равен 0, такого индекса нет arr [0].Ваш код пытается вставить элемент в массив нулевого размера.Это приводит к тому, что Index выходит за пределы исключительной ситуации.

Кстати, если это алгоритм сортировки значений, переменная «Ключ» не требуется.Вы можете удалить его.Но если это необходимо, вы должны отсортировать элементы по их ключевым значениям.

Например, если у нас есть:

element 1 -> key= 101 , value= 6
element 2 -> key= 201 , value= 9
element 3 -> key= 301 , value= 2

, вы не должны сортировать их как элемент 3

Другими словами, если вы хотите отсортировать их по их значениям, передача значений ключа в качестве параметра не имеет смысла..

0 голосов
/ 07 февраля 2019

Как вы инициализируете переменную 'arr'?

В любом случае проблема в том, что при создании массива вы должны указать начальную емкость.И каждый раз, когда вы добавляете элемент в массив, вы собираетесь его увеличить.Когда вы попытаетесь запросить ячейку с индексированным массивом i, если емкость массива будет меньше, чем I - вы получите исключение arrayOutOfBoundsException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...