Kotlin. Клас Array. Присвоєння масивів. Оператор =

Клас Array. Присвоєння масивів. Оператор =. Змінні та методи класу Array

Перед вивчення даної теми рекомендується ознайомитись з наступною темою:


Зміст


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

1. Внутрішні змінні та методи класу Array. Огляд

У класі Array визначено наступні внутрішні змінні:

  • size – повертає розмір масиву (кількість елементів).

Оператори, що працюють з класом Array:

  • = – оператор присвоєння одного масиву іншому;
  • += – оператор додавання нового елементу в кінець масиву
  • [ ] – функція індексування – отримати елемент за вказаним індексом. Це є аналог функції set().

Найбільш вживані методи класу Array:

  • get() – повертає елемент за заданим індексом;
  • set() – встановлює значення елементу за вказаним індексом;
  • copyOf() – отримати копію масиву;
  • copyOfRange() – отримати копію масиву з заданого діапазону;
  • plus() – додає новий елемент до масиву, у результаті отримується інший масив з новим елементом;
  • plusElement() – додає новий елемент до масиву, це є inline-реалізація;
  • fill() – заповнює заданими значеннями масив;
  • reverse() – реверсує масив;
  • sliceArray() – дозволяє отримати фрагмент масиву за заданим діапазоном.

 

2. Присвоєння масивів. Оператор =. Повне копіювання масиву. Метод clone()

У мові Kotlin масив можна сформувати на основі іншого масиву. Для цього можна використати одну з наступних операцій:

  • операцію присвоєння =;
  • метод clone();
  • методи copyOf(), copyOfRange() та sliceArray(). Ці методи описуються у наступних пунктах.

Якщо для двох масивів однакового типу A та B використати операцію присвоєння

A = B

то обидва посилання A, B будуть вказувати на один масив (одну ділянку пам’яті). У результаті, будь-які зміни в масиві будуть спільними для обох посилань.

Щоб зробити повну копію масиву B потрібно використати метод clone()

A = B.clone()

У цьому випадку створюються два незалежні один від одного масиви. Зміни в одному масиві не будуть впливати на зміни в іншому масиві.

 

3. Методи get(), set(). Оператор індексування масиву [ ]. Доступ до окремих елементів масиву

Для доступу до одиночних елементів масиву типу Array використовуються методи get() та set().

Метод get() дозволяє отримати значення елементу масиву за заданим індексом. Згідно з документацією, оголошення функції get() має вигляд

public final operator fun get(index: kotlin.Int): T

тут

  • index – позиція (індекс) елементу масиву, який потрібно отримати. Для першого елементу масиву значення index рівне 0;
  • T – тип елементів масиву.

Метод set() встановлює нове значення за заданим індексом. Загальний вигляд оголошення методу наступний

public final operator fun set(index: kotlin.Int, value: T): Unit

тут

  • index – позиція (індекс) елементу в масиві, для якого встановлюється значення value. Позиції index нумеруються з 0;
  • value – значення, що записується в позицію index.

Заміну методам get() та set() здійснює операція індексування [ ]. Ця операція дозволяє читати елемент з масиву та записувати його в масив.

Приклад.

fun main(args: Array<String>) {

  // 1. Методи get(), set()
  // 1. Створити масив з 3 елементів
  var A : Array<Int?> = arrayOfNulls(3)

  // 2. Записати в масив числа - метод set()
  A.set(0, 25)
  A.set(1, 30)
  A.set(2, 18)

  // 3. Вивести створений масив на екран - метод get()
  var i : Int = 0

  while (i<A.size) {
    println("A[" + i + "] = " + A.get(i))
    i++
  }
}

Результат виконання програми

A[0] = 25
A[1] = 30
A[2] = 18

 

4. Метод copyOf(). Отримати копію масиву

Метод copyOf() здійснює копіювання одного масиву в інший масив. Метод подібний до методу clone(). Метод має дві перевантажені реалізації

public inline fun <T> Array<T>.copyOf(): Array<T>
public inline fun <T> Array<T>.copyOf(newSize: Int): Array<T?>

тут

  • T – тип елементів масиву;
  • newSize – новий розмір масиву-приймача.

Виклик методів може бути

Dest = Source.copyOf()

або

Dest = Source.copyOf(newSize)

тут

  • Dest – новостворений масив, який є копією масиву Source. Цей масив розміщується в іншій ділянці пам’яті;
  • Source – масив-джерело з якого виконується копія у масив Dest;
  • newSize – розмір, що встановлюється для масиву Dest.

Перша реалізація без параметрів копіює масив-джерело у масив-приймач.

Друга реалізація дозволяє додатково задати розмір масиву-приймача при копіюванні.

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

Приклад.

У прикладі демонструються перевантажені реалізації методу copyOf().

fun main(args: Array<String>) {

  // 1. Метод copyOf()
  // 1. Створити масив з 3 рядків
  val A : Array<String?> = arrayOfNulls(3)

  // 2. Записати в масив A рядки та вивести його
  A[0] = "abcd"; A[1] = "efgh"; A[2] = "jklmn"
  print("A => ")
  for (s in A)
    print(s + " ")
  println()

  // 3. Отримати копію масиву в масиві B
  val B = A.copyOf()

  // 4. Вивести масив B
  print("B = A.copyOf() => ")
  for (s in B)
    print(s + " ") // B = abcd efgh jklmn
  println()

  // 5. Отримати копію масиву B зі збільшенням кількості елементів до 5.
  //    Копія розміщується в масиві C.
  val C = B.copyOf(5)

  // 6. Вивести масив C
  print("C = B.copyOf(5) => ")
  for (s in C)
    print(s + " ") // C = abcd efgh jklmn null null
  println()

  // 7. Отримати копію з масиву C зі зменшенням кількості елементів до 2.
  //   Копія розміщується в масиві D.
  val D = C.copyOf(2)

  // 8. Вивести масив D
  print("D = C.copyOf(2) => ")
  for (s in D)
    print(s + " ")
}

Результат виконання програми

A => abcd efgh jklmn
B = A.copyOf() => abcd efgh jklmn
C = B.copyOf(5) => abcd efgh jklmn null null
D = C.copyOf(2) => abcd efgh

 

5. Метод copyOfRange(). Отримати копію масиву з заданого діапазону

Метод copyOfRange() подібний до методу copyOf() з тією різницею, що він дозволяє задати діапазон значень масиву-джерела, які повинні бути скопійовані в масив-приймач.

Згідно з документацією оголошення методу має вигляд:

public inline fun <T> Array<T>.copyOfRange(fromIndex: Int, toIndex: Int): Array<T>

тут

  • T – тип елементів масиву;
  • fromIndex – значення, що задає початок діапазону копіювання;
  • toIndex – значення, що задає кінець діапазону копіювання.

Функція копіює елементи масиву-джерела у масив-приймач починаючи зі значення fromIndex до значення toIndex. Нумерація значень fromIndex та toIndex починається з 0.

Значення toIndex визначає номер елементу, що слідує за останнім елементом в діапазоні копіювання. Це означає, що, якщо потрібно скопіювати елементи з позиції 0 до позиції 2 включно, виклик функції copyOfRange() має бути таким:

copyOfRange(0, 3)

Приклад.

fun main(args: Array<String>) {
  // Метод copyOfRange()
  // 1. Створити масив з 10 чисел типу Float
  var A : Array<Float> = arrayOf()

  // 2. Заповнити масив значеннями
  for (i in IntRange(1, 10))
    A = A.plus(i.toFloat())

  // 3. Вивести масив A
  for (i in A)
    print(i.toString() + " ")
  println()

  // 4. Отримати копію з масиву A в діапазоні [3; 6]
  var B = A.copyOfRange(3, 6)

  // 5. Вивести масив B
  for (i in B)
    print(i.toString() + " ")
}

Результат виконання програми

1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0
4.0 5.0 6.0

 

6. Методи plus() та plusElement(). Додати елемент або масив до поточного масиву

Методи plus() та plusElement() призначені для збільшення розміру викликаючого (поточного) масиву на один елемент або декілька елементів.

Згідно з документацією, метод plus() має наступні перевантажені реалізації

public operator fun <T> Array<T>.plus(element: T): Array<T>
public operator fun <T> Array<T>.plus(elements: Array<out T>): Array<T>
public operator fun <T> Array<T>.plus(elements: collections.Collection<T>): Array<T>

тут

  • T – тип елементів масиву;
  • element, elements – елемент або елементи, що додаються в кінець поточного масиву.

Перша реалізація методу plus() додає одиночний елемент в кінець поточного масиву. Друга реалізація додає масив в кінець поточного масиву. Третя реалізація додає колекцію в кінець поточного масиву.

Оголошення методу plusElement() наступне

public inline fun <T> Array<T>.plusElement(element: T): Array<T>

тут

  • T – тип елементів масиву;
  • element – елемент, що додається до поточного масиву.

 

6.1. Метод plus(). Додавання до масиву одиночних елементів. Приклад

 

fun main(args: Array<String>) {
  // Методи plus(), plusElement()

  // Сформувати масив з 10 цифр '0'..'9'.
  // Використати метод plus().
  // 1. Оголосити пустий масив
  var A : Array<Char> = arrayOf()

  // 2. Цикл формування масиву - метод plus
  for (c in '0'..'9')
    A = A.plus(c)

  // 3. Вивести масив
  print("A => ")
  for (c in A)
    print(c + " ")
  println()
}

Результат виконання програми

A => 0 1 2 3 4 5 6 7 8 9

 

6.2. Метод plus(). Додавання до масиву іншого масиву. Приклад

 

// Методи plus(), plusElement()
// Сформувати масив B на основі двох інших масивів C і D.
// B = B + C + D

// 1. Оголосити масиви B, C, D та заповнити їх деякими даними
var B : Array<Int> = arrayOf(1, 2, 3)
var C : Array<Int> = arrayOf(4, 5)
var D : Array<Int> = arrayOf(6, 7, 8, 9, 0)

// 2. Обчислення: B = B + C + D
B = B.plus(C.plus(D))

// 3. Вивести масив B
print("B => ")
for (i in B)
  print(i.toString() + " ")
println()

Результат виконання програми

B => 1 2 3 4 5 6 7 8 9 0

 

6.3. Метод plusElement(). Додавання одиночного елементу до масиву. Приклад

Метод plusElement() використовується для додавання окремого елементу в кінець масиву. Згідно з документацією, оголошення методу наступне:

public inline fun <T> Array<T>.plusElement(element: T): Array<T>

тут

  • T – тип елементів масиву;
  • element – елемент, що додається в кінець поточного масиву.

Приклад.

fun main(args: Array<String>) {
  // Методи plus(), plusElement()

  //   Сформувати масив з кубів чисел від 1 до 10.
  //   Використати метод plusElement().
  // 1. Оголосити пустий масив
  var A : Array<Double> = arrayOf()

  // 2. Цикл формування масиву - метод plusElement
  for (x in IntRange(1, 10))
    A = A.plusElement(x.toDouble())

  // 3. Вивести масив
  print("A => ")
  for (x in A)
    print((x*x*x).toString() + " ")
  println()
}

Результат виконання програми

A => 1.0 8.0 27.0 64.0 125.0 216.0 343.0 512.0 729.0 1000.0

 

7. Метод fill(). Заповнити масив заданими значеннями

Метод fill() заповнює масив заданими значеннями в заданому діапазоні. Метод має оголошення

public fun <T> Array<T>.fill(element: T, fromIndex: Int, toIndex: Int): Unit

тут

  • T – тип елементів масиву;
  • fromIndex, toIndex – необов’язкові цілочисельні значення, що задають початок та кінець діапазону, який заповнюється. Значення toIndex визначає позицію, яка є за останнім елементом діапазону. Якщо значення fromIndex та toIndex відсутні, то заповнюється увесь масив.

Приклад.

fun main(args: Array<String>) {
  // Метод fill()

  // 1. Оголосити масив типу Double з 10 елементів
  var A : Array<Double?> = arrayOfNulls(10)

  // 2. Заповнити масив значеннями 5.0
  A.fill(5.0)

  // 3. Вивести масив
  for (x in A)
    print(x.toString() + " ")
  println()

  // 4. Записати у перші 5 елементів значенням 0.0
  A.fill(0.0, 0, 6)

  // 5. Повторно вивести масив
  for (x in A)
    print(x.toString() + " ")
}

Результат виконання програми

5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0
0.0 0.0 0.0 0.0 0.0 0.0 5.0 5.0 5.0 5.0

 

8. Метод reverse(). Реверсування масиву

Метод reverse() реалізує реверсування викликаючого масиву. Метод має оголошення

public fun <T> Array<T>.reverse(): Unit

тут

  • T – тип елементів масиву.

Приклад.

fun main(args: Array<String>) {
  // Метод fill()

  // 1. Оголосити масив типу Short з 5 елементів
  var A : Array<Short?> = arrayOfNulls(5)

  // 2. Заповнити масив значеннями від 1 до 5
  for (i in IntRange(1, 5))
    A[i-1] = i.toShort()

  // 3. Вивести масив A
  for (d in A)
    print(d.toString() + " ")
  println()

  // 4. Реверсувати масив
  A.reverse()

  // 5. Повторно вивести масив
  for (d in A)
    print(d.toString() + " ")
}

Результат виконання програми

1 2 3 4 5
5 4 3 2 1

 

9. Метод sliceArray(). Отримати фрагмент масиву за заданим діапазоном

Метод sliceArray() дозволяє отримати фрагмент масиву за заданим діапазоном. Діапазон задається типом IntRange. Оголошення масиву має вигляд

public fun <T> Array<T>.sliceArray(indices: ranges.IntRange): Array<T>

тут

  • T – тип елементів масиву;
  • indices – діапазон елементів.

Приклад.

fun main(args: Array<String>) {
  // Метод sliceArray()

  // 1. Оголосити масив типу Char з 10 елементів
  var A : Array<Char?> = arrayOfNulls(10)

  // 2. Заповнити масив значеннями - цифри від '0' до '9'
  for (i in IntRange(0, 9))
    A.set(i, '0' + i)

  // 3. Вивести масив A
  for (c in A)
    print(c.toString() + " ")
  println()

  // 4. Отримати фрагмент масиву за діапазоном [2; 5]
  // 4.1. Оголосити масив
  var B : Array<Char?>

  // 4.2. Сформувати діапазон
  val range : IntRange = 2..5

  // 4.3. Сформувати масив B
  B = A.sliceArray(range)

  // 5. Повторно вивести масив
  for (c in B)
    print(c.toString() + " ")
}

Результат виконання програми

0 1 2 3 4 5 6 7 8 9
2 3 4 5

 


Споріднені теми