JavaRush /Курси /C# SELF /Основні операції над одномірними масивами

Основні операції над одномірними масивами

C# SELF
Рівень 7 , Лекція 3
Відкрита

1. Вступ

Що зазвичай хочеться робити з масивами?

Перелічімо базові операції:

  • Читання та зміна елементів масиву за індексом.
  • Пошук елемента за значенням.
  • Копіювання масиву, створення «зрізів» (частин масиву).
  • Сортування масиву.
  • Реверс (розворот) масиву.
  • Заповнення масиву значенням.
  • Перевірка наявності елемента (чи містить масив задане значення).
  • Зміна довжини (resize).

У реальних завданнях ви часто стикаєтеся з цими діями — наприклад, «чи є сума більша за 4 000?», «знайдіть першу ціну, меншу за 1 000», «відсортуйте ціни за зростанням» тощо.

І для всього цього маємо методи

Операція Метод / Синтаксис Особливості
Зміна за індексом
arr[n] = x
Помилка, якщо індекс поза межами
Пошук значення
Array.IndexOf(arr, v)
-1, якщо не знайдено
Перевірка наявності
Array.Exists(arr, pred)
Лямбда-вираз або метод
Сортування
Array.Sort(arr)
Масив змінюється на місці
Реверс
Array.Reverse(arr)
Змінює порядок елементів
Копіювання
arr.Clone(), Array.Copy
Поверхневе копіювання
Заповнення
Array.Fill(arr, val)
Заповнює одним значенням
Зміна розміру
Array.Resize(ref arr, len)
Нові елементи — за замовчуванням (default)
Пошук максимуму/мінімуму
arr.Max(), arr.Min()
Потрібен LINQ

2. Читання та зміна елементів за індексом

З цим ви вже знайомі; закріпімо на простому прикладі (нехай у нас є масив оцінок):

// Масив оцінок студента
int[] grades = { 4, 3, 5, 2, 5 };

// Прочитаємо першу оцінку
int firstGrade = grades[0];
Console.WriteLine($"Перша оцінка: {firstGrade}");

// Змінюємо останню оцінку на «відмінно» (5)
grades[^1] = 5;
Console.WriteLine("Змінена остання оцінка: " + grades[^1]);
Читання та зміна елементів масиву за індексом

Важливо: індексація починається з нуля; спроба звернутися до неіснуючого індексу призводить до винятку IndexOutOfRangeException — класика жанру на співбесідах і в житті.

3. Пошук елемента в масиві

Є два методи, що шукають елемент у масиві й повертають його індекс, якщо знайдено.

Метод Array.IndexOf(value [, from])

Метод Array.IndexOf шукає заданий елемент з початку масиву. Якщо елемент знайдено — повертає його індекс. Якщо ні — повертає -1.

А що робити, якщо ви хочете знайти наступні вхідження потрібного елемента в масиві? Для цього методу Array.IndexOf потрібно передати другий параметр — індекс, від якого почати пошук. Це має бути індекс останнього знайденого елемента + 1.

Знайдімо всі вхідження числа 2 у нашому масиві:

int[] grades = { 4, 3, 5, 2, 5, 2 };
int x = 2; // елемент, який шукаємо

int index = Array.IndexOf(grades, x);
while (index != -1)
{
    Console.WriteLine($"Елемент {x} знайдено на позиції: {index}");
    // Шукаємо наступний індекс, починаючи з позиції index + 1
    index = Array.IndexOf(grades, x, index + 1);
} 
Пошук усіх вхіджень елемента за допомогою Array.IndexOf

Метод Array.LastIndexOf(value [, from])

Метод Array.LastIndexOf шукає заданий елемент з кінця масиву. Якщо елемент знайдено — повертає його індекс. Якщо ні — повертає -1. В іншому він повністю аналогічний методу Array.IndexOf.

Знайдімо всі вхідження числа 2 у нашому масиві, але шукатимемо з кінця:

int[] grades = { 4, 3, 5, 2, 5, 2 };
int x = 2; // елемент, який шукаємо

int index = Array.LastIndexOf(grades, x);
while (index != -1)
{
    Console.WriteLine($"Елемент {x} знайдено на позиції: {index}");
    // Шукаємо наступний індекс, починаючи з попередньої позиції - 1
    index = Array.LastIndexOf(grades, x, index - 1);
}
Пошук усіх вхіджень елемента з кінця за допомогою Array.LastIndexOf

4. Перевірка наявності елемента в масиві

Для перевірки наявності елемента є метод Contains. Він повертає true, якщо масив містить указаний елемент. Для його роботи обовʼязково додайте простір імен System.Linq. Приклад:

using System.Linq; // Додайте using System.Linq;, якщо його немає

bool hasExcellent = grades.Contains(5); 
Console.WriteLine($"Є пʼятірка? {hasExcellent}");
Перевірка наявності значення в масиві за допомогою Contains

Усе дуже просто й наочно.

5. Реверсувати масив: Array.Reverse

Припустімо, ви хочете розвернути масив «догори дриґом». Використовуйте:

int[] grades = { 2, 3, 4, 5 };

// Розвертаємо масив
Array.Reverse(grades);
Console.WriteLine("Після реверсу: " + string.Join(", ", grades));
Розворот масиву за допомогою Array.Reverse

Це зручно для пошуку «найсвіжіших» даних або просто, якщо вам подобається дивитися на світ догори дриґом.

6. Сортування масиву: Array.Sort

Рано чи пізно ви захочете відсортувати масив. Найпростіший і надійний спосіб — скористатися стандартним методом сортування:

int[] grades = { 4, 3, 5, 2, 5 };
// Сортуємо за зростанням
Array.Sort(grades);
Console.WriteLine("Відсортовані оцінки: " + string.Join(", ", grades));
Сортування масиву за зростанням за допомогою Array.Sort

Цей метод сортує й рядки — в алфавітному порядку.

Сортування за спаданням

Стандартний Array.Sort сортує лише за зростанням. Для сортування за спаданням скористайтеся комбінацією сортування та реверсу:

Array.Sort(grades); // Спочатку за зростанням
Array.Reverse(grades); // Потім розвертаємо
Console.WriteLine("За спаданням: " + string.Join(", ", grades));
Сортування за спаданням: Sort + Reverse

Примітка: часто забувають, що сортування відбувається «на місці»: масив змінюється, нового не повертається. Якщо потрібен початковий порядок, спершу скопіюйте масив.

7. Клонування масиву: Clone і Array.Copy

Якщо потрібно створити копію (і не псувати початковий масив під час обробки), скористайтеся методами Clone() і Array.Copy().

Метод Clone() викликають у масиву, і він поверне його повну копію.

Метод Array.Copy() вимагає передати такі дані:

  • масив-джерело;
  • масив-призначення;
  • кількість комірок для копіювання.
int[] original = { 1, 2, 3, 4, 5 };

// Спосіб 1: Clone()
// Працює для одно- та багатовимірних масивів, але повертає object — потрібне приведення типу:
int[] copy1 = (int[]) original.Clone();

// Спосіб 2: Array.Copy
int[] copy2 = new int[original.Length];
Array.Copy(original, copy2, original.Length);
Клонування масиву: Clone() і Array.Copy()

Важлива особливість: для примітивних типів (int, double) копіюються значення. Якщо це масив об’єктів, копіюються лише посилання — так зване «поверхневе копіювання».

8. Заповнення масиву значенням: Array.Fill

Хочете «обнулити» масив або заповнити його всіма пʼятірками? Для цього є зручний метод — Array.Fill:

int[] grades = new int[5];
Array.Fill(grades, 5); // Тепер усі елементи дорівнюють 5
Console.WriteLine("Гіпотетично ідеальний студент: " + string.Join(", ", grades));
Заповнення масиву значенням за допомогою Array.Fill

Корисно, коли потрібно швидко ініціалізувати масив певним значенням.

9. Пошук максимального і мінімального значення

Простір імен System.Linq додає масивам багато корисних методів, і два з них повертають мінімальне та максимальне значення в масиві. Це Max() і Min().

Знайдімо максимальну та мінімальну оцінку в масиві:

int maxGrade = grades.Max();
int minGrade = grades.Min();
Console.WriteLine($"Максимальна оцінка: {maxGrade}, мінімальна: {minGrade}");
Пошук максимального і мінімального значення в масиві

Не забудьте додати using System.Linq; для цих методів.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ