for loop в Kotlin

130
28 ноября 2019, 05:20

Еще не успел освоить что то более сложное чем простые циклы в kotlin, поэтому не знаю как можно взять индекс в самом теле цикла. Для примера на java цикл выглядит так:

for (int i = 2; i <= n / i; i++)

В kotlin пробую такую конструкцию:

for (i in 2..n.div(i))

где вторая i выделана как не разпознаная. Как вызвать индекс в такой ситуации?

Answer 1

Цикл for в Kotlin не занимается микроменеджментом переменной-счётчика, он перебирает элементы Iterable. В вашем примере 2..n - это объект типа IntRange, перебор элементов которого даёт целые числа от 2 до n, которые и присваиваются переменной i на каждой итерации цикла. Перебираемый объект создаётся до вхождения в цикл, изменять его во время перебора нельзя. Аналогом из Java для такого цикла будет цикл foreach: for (Integer i : ints). Если вам нужно в Kotlin менять условие выхода из цикла на каждой итерации, воспользуйтесь циклом while.

Answer 2

Можно решить эту проблему проще

Java:

int cond = (int) Math.sqrt(n);
for (int i = 2; i <= cond; i++)
     System.out.println(i);

Kotlin:

val cond: Int = sqrt(n.toDouble()).toInt()
for (i in 2..cond) println(i)

О том как работает Ranges в Kotlin

READ ALSO
BeanPostProcessor vs (@PostConstruct&#187; and &#171;@PreDestroy&#187;)

BeanPostProcessor vs (@PostConstruct» and «@PreDestroy»)

BeanPostProcessor дает возможность подключиться к жизненному циклу бина и взаимодействовать с ним по мере его обработки, а именно с помощью двух...

121
Не выполняется запрос через HQL ( Hibernate )

Не выполняется запрос через HQL ( Hibernate )

У меня есть база данныхЯ к ней подключился из IDEA

111
Ошибка при попытке запуска кода через maven

Ошибка при попытке запуска кода через maven

Заранее предупреждаю, очень много букв

149
LinkedHashMap - неконтролируемое переприсваивание

LinkedHashMap - неконтролируемое переприсваивание

Делаю подобие бд в виде LinkedHashMapПри попытке изменить юзеру параметр, он меняется у всех юзеров

117