1. Общ преглед
В този урок ще видим различни начини да проверим дали масивът е сортиран.
Преди да започнете обаче, би било интересно да проверите как да сортирате масиви в Java.
2. С бримка
Един от начините за проверка е чрез цикъл for . Можем да повторим всички стойности на масива една по една.
Нека да видим как да го направим.
2.1. Примитивен масив
Просто казано, ще повторим всички позиции, освен последната. Това е така, защото ще сравним една позиция със следващата.
Ако някои от тях не са сортирани, методът ще върне false. Ако нито едно от сравненията не върне false, това означава, че масивът е сортиран:
boolean isSorted(int[] array) { for (int i = 0; i array[i + 1]) return false; } return true; }
2.2. Обекти, които се изпълняват, сравними
Можем да направим нещо подобно с обекти, които изпълняват сравним. Вместо да използваме знак по-голям от, ще използваме compareTo :
boolean isSorted(Comparable[] array) { for (int i = 0; i 0) return false; } return true; }
2.3. Обекти, които не се изпълняват, сравними
Но какво ще стане, ако нашите обекти не изпълняват сравними ? В този случай вместо това можем да създадем компаратор.
В този пример ще използваме обекта Employee . Това е просто POJO с три полета:
public class Employee implements Serializable { private int id; private String name; private int age; // getters and setters }
След това трябва да изберем от кое поле искаме да поръчаме. Ето, нека подредим по възрастово поле:
Comparator byAge = Comparator.comparingInt(Employee::getAge);
И тогава, можем да променим метода си, за да вземем и сравнителен :
boolean isSorted(Object[] array, Comparator comparator) { for (int i = 0; i 0) return false; } return true; }
3. Рекурсивно
Вместо това можем, разбира се, да използваме рекурсия. Идеята тук е, че ще проверим две позиции в масива и след това ще повторим, докато не проверим всяка позиция.
3.1. Примитивен масив
При този метод проверяваме последните две позиции. Ако са сортирани, ще извикаме метода отново, но с предишна позиция. Ако една от тези позиции не е сортирана, методът ще върне false:
boolean isSorted(int[] array, int length) length array[length - 1]) return false; return isSorted(array, length - 1);
3.2. Обекти, които се изпълняват, сравними
Сега, нека да погледнем отново като обекти, които изпълняват сравним. Ще видим, че същият подход с compareTo ще работи:
boolean isSorted(Comparable[] array, int length)
3.3. Обекти, които не се изпълняват, сравними
Напоследък нека опитаме отново обекта на служител , като добавим параметъра Comparator :
boolean isSorted(Object[] array, Comparator comparator, int length) if (array == null
4. Заключение
В този урок видяхме как да проверим дали масивът е сортиран или не. Видяхме както итеративни, така и рекурсивни решения.
Нашата препоръка е да използвате цикличното решение. По-чист е и по-лесен за четене.
Както обикновено, изходният код от този урок може да бъде намерен в GitHub.