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

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


Содержание


Поиск на других ресурсах:

1. Цикл for. Способы реализации. Общая форма

В языке Kotlin цикл for подобен циклу foreach языков программирования Java, C#. Он позволяет производить обход значений элементов некоторой коллекции, массива, диапазона или другого набора значений.

Обход значений объекта, который содержит набор элементов, может производиться в прямом и обратном направлениях. Также при обходе значений можно указывать шаг.

Если обход элементов некоторого набора осуществляется в прямом направлении, то общая форма цикла следующая

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)

  // 4. Вывести список строк в обратном порядке
  println()
  for (s in ls.reversed())
    print(s + " ")

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

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

  // 5.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)

  // 5. Вычислить сумму парных элементов массива
  summ = 0
  for (i in A)
    if (i%2 == 0)
  summ += i
  println("summPair = " + summ)

  // 6. Вычислить сумму элементов, которые размещены на парных позициях (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

 


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