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. Сформировать массив из кубов чисел от 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

 


Связанные темы