Java. Розробка класу, що реалізує алгоритм сортування вибором
У даній темі описується покроковий процес створення узагальненого класу, що реалізує алгоритм сортування вибором. Тема буде корисна початківцям при вивченні основ об’єктно-орієнтованого програмування. Принцип роботи алгоритму сортування вибором детально описується в темі:
Зміст
- 1. Умова задачі
- 2. Виконання
- 2.1. Створення проекту. Класи SortSelection та TestSortSelection
- 2.2. Ввід внутрішніх змінних класу
- 2.3. Конструктори класу
- 2.4. Методи Get(), Set(). Доступ до внутрішнього масиву
- 2.5. Метод Sort(). Сортування всього масиву
- 2.6. Метод SortRange(). Сортування масиву в заданих межах
- 2.7. Метод Print(). Виведення масиву
- 3. Розробка класу TestSortSelection, метод main(). Тестування роботи класу SortSelection
- 4. Структура всієї програми (модуля TestSortSelection.java). Скорочений варіант
- 5. Результат виконання програми
- Зв’язані теми
Пошук на інших ресурсах:
1. Умова задачі
Розробити узагальнений клас SortSelection, який містить засоби, що реалізують алгоритм сортування вибором. Продемонструвати роботу методів класу.
⇑
2. Виконання
2.1. Створення проекту. Класи SortSelection та TestSortSelection
Першим кроком створюється модуль TestSortSelection.java, в якому оголошується два класи:
- клас SortSelection<T> – реалізує алгоритм сортування вибором. Параметр T типу в класі є обмежений типом Number (T extends Number). Це означає, що клас призначений для обробки числових даних, наприклад, даних типів Integer, Long, Short, Double та інших;
- клас TestSortSelectin – призначений для тестування (використання) роботи класу SortSelection.
На даний момент, текст модуля TestSortSelection.java наступний.
// Узагальнений клас, що реалізує алгоритм сортування вибором. // Клас обробляє числові типи (Integer, Double, ...) - обмежений типом Number class SortSelection<T extends Number> { } public class TestSortSelection { // У методі main() тестується робота класу SortSelection public static void main(String[] args) { } }
⇑
2.2. Ввід внутрішніх змінних класу
У класі SotrSelection<T> в розділі private вводиться внутрішня змінна A – масив оброблюваних чисел.
// Узагальнений клас, що реалізує алгоритм сортування вибором. // Клас обробляє числові типи (Integer, Double, ...) - обмежений типом Number class SortSelection<T extends Number> { private T[] A; // масив, який сортується } ...
⇑
2.3. Конструктори класу
Ініціалізацію даних класу виконують конструктори. У класі SortSelection релізовано три конструктори:
- конструктор без параметрів – встановлює значення null для посилання A;
- конструктор, що отримує вхідним параметром зовнішній масив типу T[]. З допомогою методу clone() у конструкторі формується повна копія зовнішнього масиву;
- конструктор, що отримує вхідним параметром інший екземпляр класу SortSelection<T>.
// Конструктори класу // Конструктор без параметрів SortSelection() { A = null; } // Конструктор, що отримує параметром масив _A типу T[] SortSelection(T[] _A) { A = _A.clone(); // Зробити повну копію з _A } // Конструктор, що отримує параметром інший екземпляр класу SortSelection<T> SortSelection(SortSelection<T> obj) { A = obj.A.clone(); }
⇑
2.4. Методи Get(), Set(). Доступ до внутрішнього масиву
Для доступу до внутрішнього масиву A використовуються методи Get(), Set() які мають наступну реалізацію
// Методи доступу до внутрішніх даних у класі // Отримати повну копію внутрішнього масиву A T[] Get() { return A.clone(); } // Встановити нове значення в масиві A void Set(T[] _A) { A = _A.clone(); // зробити глубоку копію з _A }
⇑
2.5. Метод Sort(). Сортування всього масиву
Головний метод класу, який реалізує сортування в масиві A, є метод Sort().
// Метод, що реалізує алгоритм сортування вибором. // Параметр order задає порядок сортування: // - якщо order=true, то посортувати в порядку зростання; // - якщо order=false, то посортувати в порядку спадання. void Sort(boolean order) { int i, j, k; T t; for (i=0; i<A.length; i++) // i - номер кроку { k = i; t = A[i]; // Цикл пошуку найменшого (найбільшого) елементу for (j=i+1; j<A.length; j++) if (order) { // Пошук найменшого елементу if (A[j].doubleValue()<t.doubleValue()) { k = j; t = A[j]; } } else { // Пошук найбільшого елементу) if (A[j].doubleValue()>t.doubleValue()) { k = j; t = A[j]; } } A[k] = A[i]; A[i] = t; } }
⇑
2.6. Метод SortRange(). Сортування масиву в заданих межах
Бувають випадки, коли потрібно посортувати елементи в заданому діапазоні. Для цього в класі реалізовано метод SortRange(). Метод отримує три параметри: порядок сортування (за зростанням або спаданням), нижню та верхню межі діапазону.
// Метод, що реалізує алгоритм сортування вибором в заданому діапазоні [pos1, pos2-1] // Параметри: // - order - порядок сортування (true-за зростанням, false-за спаданням); // - pos1 - нижня межа індексу в масиві включно; // - pos2 - верхня межа індексу - виключно. // Якщо сортування відбулось успішно, функція повертає true, інакше - false. boolean SortRange(boolean order, int pos1, int pos2) { // Перевірка, чи значення pos1, pos2 адекватні if (pos1>=pos2) return false; if ((pos1<0) || (pos1>=A.length)) return false; if ((pos2<0) || (pos2>A.length)) return false; // Якщо все в порядку, то посортувати масив int i, j, k; T t; for (i=pos1; i<pos2; i++) // i - номер кроку { k = i; t = A[i]; // Цикл пошуку найменшого (найбільшого) елементу for (j=i+1; j<pos2; j++) if (order) { // Пошук найменшого елементу if (A[j].doubleValue()<t.doubleValue()) { k = j; t = A[j]; } } else { // Пошук найбільшого елементу if (A[j].doubleValue()>t.doubleValue()) { k = j; t = A[j]; } } A[k] = A[i]; A[i] = t; } return true; }
⇑
2.7. Метод Print(). Виведення масиву
// Метод, що виводить вміст масиву A - використовується при тестуванні класу void Print(String comment) { System.out.println(comment); for (int i=0; i<A.length; i++) System.out.print(A[i]+" "); System.out.println(); }
⇑
3. Розробка класу TestSortSelection, метод main(). Тестування роботи класу SortSelection
У класі TestSortSelection реалізовано метод main(), в якому продемонстровано використання методів класу SortSelection.
public class TestSortSelection { // У методі main() тестується робота класу SortSelection public static void main(String[] args) { // 1. Використання екземпляру класу для типу Integer Integer[] AI = { 2, 3, 8, 1, 4, 7, 9, 5, 2 }; SortSelection<Integer> objInt1 = new SortSelection<Integer>(AI); objInt1.Print("Before sorting - objInt1:"); // вивести масив перед сортуванням // 1.1. Посортувати масив в порядку спадання елементів objInt1.Sort(false); objInt1.Print("After sorting - objInt1:"); // 1.2. Протестувати метод Get() Integer[] AI2; AI2 = (Integer[])objInt1.Get(); // скопіювати масив екземпляру objInt1 // 1.3. Вивести масив AI2 System.out.println("Array AI2: "); for (int i=0; i<AI2.length; i++) System.out.print(AI2[i]+" "); System.out.println(); // 1.4. Посортувати елементи масиву objInt1 в заданих межах [2, 5] // Тест методу SortRange() int pos1 = 2; int pos2 = 6; objInt1.SortRange(true, pos1, pos2); // в порядку зростання objInt1.Print("objInt1.Range(true, 2, 6)"); // 2. Використання екземпляру класу для типу Float Float[] AF = { 2.8f, 3.5f, 11.23f, 0.5f, 2.4f, 1.1f }; SortSelection<Float> objFloat1 = new SortSelection<Float>(AF); objFloat1.Print("Array objFloat1 before sorting"); // 2.1. Посортувати елементи в порядку зростання objFloat1.Sort(true); objFloat1.Print("Array objFloat1 after sorting"); // 2.2. Протестувати метод Set() Float[] AF2 = { 0.1f, 0.5f, -0.2F, -1.3F, -100.77F }; objFloat1.Set(AF2); // встановити новий масив в екземплярі objFloat1 objFloat1.Print("Array objFloat1 after changing:"); } }
⇑
4. Структура всієї програми (модуля TestSortSelection.java). Скорочений варіант
// Узагальнений клас, що реалізує алгоритм сортування вибором. // Клас обробляє числові типи (Integer, Double, ...) - обмежений типом Number class SortSelection<T extends Number> { private T[] A; // масив, який сортується // Конструктори класу // Конструктор без параметрів SortSelection() { ... } // Конструктор, що отримує параметром масив _A типу T[] SortSelection(T[] _A) { ... } // Методи доступу до внутрішніх даних в класі // Отримати повну копію внутрішнього масиву A T[] Get() { ... } // Встановити нове значення в масиві A void Set(T[] _A) { ... } // Метод, що реалізує алгоритм сортування вибором. // Параметр order задає порядок сортування: // - якщо order=true, то посортувати в порядку зростання; // - якщо order=false, то посортувати в порядку спадання. void Sort(boolean order) { ... } // Метод, що реалізує алгоритм сортування вибором в заданому діапазоні [pos1, pos2-1] boolean SortRange(boolean order, int pos1, int pos2) { ... } // Метод, що виводить вміст масиву A - використовується при тестуванні класу void Print(String comment) { ... } } public class TestSortSelection { ... }
⇑
5. Результат виконання програми
Before sorting - objInt1: 2 3 8 1 4 7 9 5 2 After sorting - objInt1: 9 8 7 5 4 3 2 2 1 Array AI2: 9 8 7 5 4 3 2 2 1 objInt1.Range(true, 2, 6) 9 8 3 4 5 7 2 2 1 Array objFloat1 before sorting 2.8 3.5 11.23 0.5 2.4 1.1 Array objFloat1 after sorting 0.5 1.1 2.4 2.8 3.5 11.23 Array objFloat1 after changing: 0.1 0.5 -0.2 -1.3 -100.77 objFloat2: 0.1 0.5 -0.2 -1.3 -100.77
⇑
Зв’язані теми
⇑