1. Метод Arrays.fill()
Дуже часто у Java-програмістів при роботі з масивами виникає завдання: заповнити масив однаковими значеннями. Можна, звісно, написати цикл і просто у циклі присвоїти кожній комірці масиву певне значення:
int[] x = new int[100];
for (int i = 0; i < x.length; i++)
x[i] = 999;
А можна просто викликати метод Arrays.fill(), який робить точно те саме: заповнює переданий масив переданим значенням. Ось як це виглядає:
Arrays.fill(ім'я, значення)
І код із прикладу вище можна зробити трохи компактніше і зрозуміліше:
int[] x = new int[100];
Arrays.fill(x, 999);
А ще за допомогою методу Arrays.fill() можна заповнити певним значенням не весь масив, а його частину:
Arrays.fill(ім'я, перший, останній, значення)
Де перший і останній — це номери першої та останньої комірок, які потрібно заповнити.
Приклад:
|
Заповнюємо комірки x[3], x[4], x[5], x[6] значеннями 999. Нумерація комірок масиву з нуля!Змінна str містить значення: |
Метод Arrays.fill() працює лише з одномірними масивами. Якщо в нього передати двовимірний масив, він буде оброблений як одномірний, з усіма наслідками, що з цього випливають.
2. Метод Arrays.copyOf()
Як ви вже знаєте, розмір контейнера масиву після його створення змінити не можна.
А якщо дуже хочеться?
Ну, якщо дуже хочеться, то можна:
- Створити новий масив потрібної довжини
- Скопіювати в нього всі елементи з першого масиву.
Саме це, до речі, й робить метод Arrays.copyOf(). Ось як виглядає його виклик:
тип[] ім'я2 = Arrays.copyOf(ім'я, довжина);
Цей метод не змінює існуючий масив, замість цього він створює новий масив і копіює в нього елементи старого масиву.
Якщо елементи не помістилися (довжина менша за довжину існуючого масиву), то зайві значення ігноруються.
Якщо довжина нового масиву більша за довжину старого, осередки заповнюються нулями.
Приклад:
|
Змінна str2 містить значення: Змінна str3 містить значення: |
3. Метод Arrays.copyOfRange()
А що робити, якщо ви хочете отримати масив довжиною 5 з масиву довжини 10, але щоб у ньому були не перші 5 елементів, а 5 останніх?
Саме для цього випадку вам знадобиться ще один метод класу Arrays – метод Arrays.copyOfRange() Ось як виглядає його виклик:
тип[] ім'я2 = Arrays.copyOfRange(ім'я, перший, останній);
Цей метод теж створює новий масив, але заповнює його даними із довільного місця вихідного масиву. Де перший і останній — це номери першої та останньої комірок, які мають бути у новому масиві.
Приклад:
|
Змінна str2 містить значення: Змінна str3 містить значення: |
4. Метод Arrays.sort()
Ну і найцікавіше — сортування. У програмуванні сортувати масиви доводиться дуже часто. Три найчастіші дії при роботі з масивами:
- Сортування масиву
- Пошук мінімального (або максимального) елемента масиву
- Визначення індексу елемента в масиві (пошук елемента в масиві)
І саме тому розробники Java включили в клас Arrays метод sort(). Ось як виглядає його виклик:
Arrays.sort(ім'я);
Цей метод сортує переданий масив за зростанням.
Приклад:
|
Змінна str містить значення: |
Круто, так? Викликав один метод, і ось у вас ще й відсортований масив. Красота.
До речі, сортувати можна не тільки весь масив, а й частину масиву. Ось як виглядає його виклик:
Arrays.sort(ім'я, перший, останній);
Де перший і останній — це номери першої та останньої ячейок, яких має торкнутися сортування.
Приклад:
|
Змінна str містить значення: |
У Java для сортування масивів використовується найшвидший алгоритм сортування — QuickSort. Швидкість його сортування залежить від розміру масиву і розраховується за формулою N*Log(N).
Сортування масиву зі 1000 елементів міститиме близько 3_000 порівнянь ячейок масиву. Сортування масиву з мільйона елементів міститиме близько 6 мільйонів порівнянь.
5. Метод Arrays.binarySearch()
Ну і останній з найцікавіших методів класу Arrays вміє шукати задане значення в масиві. Це не звичайний пошук, а так званий бінарний пошук. Суть його ось у чому:
- Попередньо масив сортується
- Потім середній елемент масиву порівнюється з шуканим (з тим, який ми шукаємо).
- Якщо шуканий більший за середній, пошук продовжується в правій половині масиву.
- Якщо шуканий елемент менший за середній, пошук продовжується в лівій половині масиву
Завдяки тому, що масив відсортований, можна за одне порівняння відсіяти половину масиву. Потім на наступному кроці відсіяти ще половину і т. д.
Такий підхід робить бінарний пошук дуже швидким. У масиві з мільйона(!) елементів він може знайти індекс потрібного елемента всього за 20 порівнянь. Мінусом такого підходу є те, що масив попередньо потрібно відсортувати, а сортування теж займає час.
Ось як виглядає його виклик:
int index = Arrays.binarySearch(ім'я, значення);
Де ім'я — це ім'я масиву, який потрібно передати вже відсортованим (наприклад, за допомогою функції Arrays.sort()). значення — це той елемент, який шукається в масиві. Метод повертає результат — індекс шуканого елемента в масиві (номер комірки масиву).
Приклади:
|
x містить: 41 (також підходили індекси 0 і 2)8-7 |
Якщо шуканих елементів у масиві декілька, просто повернеться номер одного з них (немає гарантій, що це буде, наприклад, найперший або навпаки — найостанніший з однакових елементів).
Якщо елемент у масиві не знайдено, індекс буде від’ємним.
6. Посилання на Oracle документацію по класу Arrays
Якщо вам дуже цікаво, повністю інформацію про клас Arrays і всі його методи ви можете прочитати в офіційній документації на сайті Oracle:
https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/util/Arrays.html
Можете прочитати, наприклад, про методи Arrays.mismatch() та Arrays.compare(). Може, знайдете в них для себе щось корисне.
І нехай вас не бентежить кількість методів – там у кожного методу є 5-10 копій, які відрізняються лише типом параметрів.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ