Java. Розробка класу, що реалізує алгоритм сортування вибором




Java. Розробка класу, що реалізує алгоритм сортування вибором

У даній темі описується покроковий процес створення узагальненого класу, що реалізує алгоритм сортування вибором. Тема буде корисна початківцям при вивченні основ об’єктно-орієнтованого програмування. Принцип роботи алгоритму сортування вибором детально описується в темі:


Зміст


Пошук на інших ресурсах:

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

 


Зв’язані теми