Страницы

Поиск по вопросам

понедельник, 1 апреля 2019 г.

Инициализация массива с помощью конструктора Java

Необходимо реализовать пузырьковую сортировку для массива. При этом массив инициализируется с помощью:
пустого конструктора, при вызове которого генерируется массив с random значениями конструктора, который на вход принимает длину и массив
Метод для генерации рэндом массива:
public static int[] arrayCreator() { int arr[] = new int[5]; for (int i = 0; i < arr.length; i++) { arr[i] = (int) ((Math.random() * 5)); } return arr; }
public void arrayPrint(int arr[]) { for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } }
Пузырьковая сортировка:
public void bubbleSort(int arr[]) { for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr.length - i - 1; j++) { if (arr[j] > arr[j + 1]) { int t = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = t; } } } }
Класс и конструтор:
public class Starter {
private static int arr[];
public static void main(String[] args) { int array[] = {1, 9, 6, -2, 12}; Starter starter = new Starter(); starter.arrayPrint(arr); starter.bubbleSort(arr); System.out.println("Array after sorting: "); starter.arrayPrint(arr); }
Starter() { int arr[] = arrayCreator(); }
Starter(int length, int array[]) { int arr[] = array; }
При создании обьекта starter конструктор не вызывается, массив не инициализуется. Дальше NullPointerException


Ответ

В конструкторах класса вы инициализируете локальные массивы вместо массива - члена класса.
Starter() { int arr[] = arrayCreator(); ^^^^^^^^^ }
Starter(int length, int array[]) { int arr[] = array; ^^^^^^^^^ }
Вам надо инициализировать член класса, а не объявлять в конструкторах локальные массивы.
Также это плохая идея делать массив статическим членом класса. Каждый объект класса должен иметь свой член класса в виде массива.
Кроме того непонятно, почему вы используете магическое число 5 в функции генерации массива со случайными значениями
public static int[] arrayCreator() { int arr[] = new int[5]; ^^^^^^^^^^ for (int i = 0; i < arr.length; i++) { arr[i] = (int) ((Math.random() * 5)); } return arr; }
Было бы более логично, если бы в эту функцию передавался аргумент, который указывал бы, какова должна быть размерность массива. Например,
public static int[] arrayCreator( int n ) { int arr[] = new int[n]; for (int i = 0; i < arr.length; i++) { arr[i] = (int) ((Math.random() * 5)); } return arr; }
Также если эти функции создания массивов используются только в конструкторах, то лучше объявить их с классом доступа private. Дополнительно можно написать еще одну public функцию типа reset, которая устанавливает новые случайные значения для элементов массива.
Также совершенно не ясно, почему не статическая функция член класса arrayPrint имеет параметр тогда, как она должна распечатывать массив своего объекта
public void arrayPrint(int arr[]) { ^^^^^^^^^^^^^^^^^^^^^ for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } }
лучше было бы определить ее как
public void arrayPrint() { ^^^^^^^^^^^^ for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } }
и соответственно вызывать без аргумента.
Обратите внимание, что объявленный в функции main массив
int array[] = {1, 9, 6, -2, 12};
нигде не используется.
Что касается вашей функции пузырьковой сортировки, то она будет выполнять циклы и проход по всему массиву, даже если массив уже отсортирован. Вы можете посмотреть ответ на аналогичный вопрос, чтобы сделать сортировку более эффективной. Хотя в том вопросе требуется отсортировать массив по убыванию, тем не мене это только сказывается на том, какой оператор логического отношения будет использовать. А в целом показан алгоритм сортировки, уменьшающий число проходов по массиву.

Комментариев нет:

Отправить комментарий