Kotlin. Цикл for. Способи реалізації

Цикл for. Способи реалізації. Застосування циклу for до діапазонів, масивів, списків, словників, множин


Зміст


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

1. Цикл for. Способи реалізації. Загальна форма

У мові Kotlin цикл for подібний до циклу foreach мов програмування Java, C#. Він дозволяє здійснювати обхід значень елементів деякої колекції, масиву, діапазону або іншого набору значень.

Обхід значень об’єкту, що містить набір елементів, може здійснюватись в прямому та зворотному напрямках. Також при обході значень можна задавати крок.

Якщо обхід елементів деякого набору здійснюється в прямому напрямку, то загальна форма циклу for наступна

for (varIter in IterObj step stepValue) {
  // Statements
  // ...
}

тут

  • IterObj – об’єкт, що містить або визначає набір значень, які потрібно послідовно обійти від першого до останнього. Таким об’єктом може бути список, масив, діапазон тощо;
  • varIter – змінна-ітератор, яка по-черзі приймає значення з набору IterObj. В тілі циклу for виконуються інструкції Statements для кожного нового значення varIter;
  • Statements – одна або декілька інструкцій, що виконуються на кожній ітерації;
  • stepValue – крок обходу значень діапазону. Значення stepValue має бути цілим додатнім числом.

Якщо крок обходу рівний 1, то фрагмент step=stepValue можна опустити

for (varIter in IterObj) {
  // Statements
  // ...
}

Якщо потрібно отримати перебір значень в заданих межах в зворотному порядку, то для цього використовується форма оператора for з ключовим словом downTo

for (varIter in BeginValue downTo EndValue step stepValue) {
  // Statements
  // ...
}

тут

  • varIter – змінна лічильник ітерацій;
  • BeginValue, EndValue – перші та останні значення, які розглядаються в зворотному порядку;
  • stepValue – крок зміни лічильника varIter. Значення stepValue повинно бути цілим позитивним числом.

Якщо stepValue рівне 1, то цей фрагмент можна опустити. У цьому випадку цикл for матиме вигляд

for (varIter in BeginValue downTo EndValue) {
  // Statements
  // ...
}

 

2. Приклади розв’язку задач з використанням циклу for
2.1. Обхід діапазону

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

fun main(args:Array<String>)
{
  // Обхід діапазону

  // 1. Заданий діапазон цілих чисел
  val ir : IntRange = 0..10

  // 2. Вивести квадрати чисел з діапазону
  for (t in ir)
    print((t*t).toString()+" ")

  // 3. Вивести квадрати парних чисел діапазону
  println()
  for (t in ir step 2)
    print((t*t).toString()+" ")

  // 4. Вивести квадрати парних чисел діапазону в зворотному порядку
  println()
  for (t in ir.last downTo ir.first step 2)
    print((t*t).toString()+" ")
}

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

0 1 4 9 16 25 36 49 64 81 100
0 4 16 36 64 100
100 64 36 16 4 0

 

2.2. Обхід списку List

У прикладі нижче демонструється обробка списку рядків та списку чисел.

fun main(args:Array<String>)
{
  // Обхід списку
  // 1. Заданий список рядків
  val ls : List<String> = listOf("abc", "abcd", "jklmn", "joprst", "pupkin", "ddeee")

  // 2. Вивести список
  for (s in ls)
    print(s + " ")

  // 3. В заданому списку обчислити позицію першого рядка з найбільшою довжиною.
  var maxLen : Int
  var posMaxLen : Int
  var i : Int

  i = 0
  posMaxLen = 0
  maxLen = ls[posMaxLen].length

  for (s in ls) {
    if (maxLen < s.length) {
    posMaxLen = i
    maxLen = s.length
  }
  i++
  }
  println()
  print("posMaxLen = " + posMaxLen + ", " + "maxLen = " + maxLen)

  // 3. Вивести список рядків у зворотному порядку
  println()
  for (s in ls.reversed())
    print(s + " ")

  // 4. У заданому списку цілих чисел обчислити суму елементів, які
  //   розміщуються на непарних позиціях 1, 3, 5, ....
  //   Вважати, що нумерація позицій починається з 0.
  // 4.1. Заданий список
  val lstInt : List<Int> = listOf(2, 4, 3, 8, 2, 1, 5, 7, 9, 3)
  var pos : Int
  var summ : Int

  // 4.2. Цикл обходу списку
  pos = 0
  summ = 0
  for (i in lstInt) {
    if (pos % 2 == 1)
    summ += i
    pos++
  }

  // 4.3. Вивести результат
  println()
  println("lstInt = " + lstInt)
  println("summ = " + summ)
}

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

abc abcd jklmn joprst pupkin ddeee
posMaxLen = 3, maxLen = 6
ddeee pupkin joprst jklmn abcd abc
lstInt = [2, 4, 3, 8, 2, 1, 5, 7, 9, 3]
summ = 23

 

2.3. Обхід елементів словника Map

Демонструється обхід елементів словника в прямому та зворотному порядку. Приклад демонструє можливості циклу for а не можливості роботи зі словниками.

fun main(args:Array<String>)
{
  // Обхід елементів словника
  // 1. Заданий словник, в якому визначені пари: номер дня тижня -> назва дня тижня
  // 1.1. Оголосити змінну типу словник <Int, String>
  var days : Map<Int, String> = mapOf()

  // 1.2. Додати до словника значення
  days = days + mapOf(Pair(1, "Monday"))
  days = days + mapOf(Pair(2, "Tuesday"))
  days += mapOf(Pair(3, "Wednesday"))
  days += mapOf(Pair(4, "Thursday"))
  days += mapOf(Pair(5, "Friday"))
  days += mapOf(Pair(6, "Saturday"))
  days += mapOf(Pair(7, "Sunday"))

  // 2. Обхід словника та виведення значень
  for (d in days)
    print(d.toString() + " ")
  println()

  // 3. Виведення значень словника у зворотному порядку
  for (d in days.keys.reversed())
    print(d.toString() + "=" + days[d] + " ")
  println()
}

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

1=Monday 2=Tuesday 3=Wednesday 4=Thursday 5=Friday 6=Saturday 7=Sunday

7=Sunday 6=Saturday 5=Friday 4=Thursday 3=Wednesday 2=Tuesday 1=Monday

 

2.4. Обхід множини Set

Даний приклад демонструє використання циклу for для обходу множини. Усі можливості множин тут не розкриваються.

fun main(args:Array<String>)
{
  // Обхід елементів множини
  // 1. Задана множина
  val Colors = setOf("Red", "Blue", "Green", "Yellow")

  // 2. Вивести елементи множини
  for (c in Colors)
    print(c + " ")
  println()

  // 3. Вивести елементи множини у зворотному порядку
  for (c in Colors.reversed())
    print(c + " ")
  println()
}

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

Red Blue Green Yellow
Yellow Green Blue Red

 

2.5. Обхід масиву Array. Обчислення суми елементів у масиві згідно з умовою

У прикладі демонструється використання циклу for для розв’язку наступних задач:

  • обхід елементів масиву та їх вивід у прямому порядку;
  • обхід елементів масиву та їх вивід у зворотному порядку;
  • обчислення суми елементів масиву;
  • обчислення суми парних елементів цілочисельного масиву;
  • обчислення суми елементів масиву, які лежать на парних позиціях.

 

fun main(args:Array<String>)
{
  // Обхід масиву чисел.
  // 1. Заданий масив чисел
  var A : Array<Int> = arrayOf(10, 20, 33, 17, 35, 11, 22)
  var i:Int
  var n:Int

  // 2. Обхід масиву в прямому порядку
  for (i in A) {
    print(i.toString() + " ")
  }
  println()

  // 3. Обхід масиву в зворотному порядку
  for (i in A.reversedArray()) {
    print(i.toString() + " ")
  }
  println()

  // 4. Обчислити суму елементів масиву
  var summ = 0
  for (i in A) {
    summ += i
  }
  println("summ = " + summ)

  // 4. Обчислити суму парних елементів масиву
  summ = 0
  for (i in A)
    if (i%2 == 0)
      summ += i
  println("summPair = " + summ)

  // 5. Обчислити суму елементів, які лежать на парних позиціях (0, 2, 4, ...)
  var pos = 0
  summ = 0
  for (i in A) {
    if (pos%2==0)
      summ += i
    pos++
  }
  println("summPairPos = " + summ)
}

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

10 20 33 17 35 11 22
22 11 35 17 33 20 10
summ = 148
summPair = 52
summPairPos = 100

 


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