对于班级,我必须编写一个计算生日问题的程序 现在,我尝试同时学习kotlin,并且遇到了一些代码片段:
val checkSet = mutableSetOf<Int>()
generateSequence{ Random.nextInt(n)}.forEach {
if(!checkSet.add(it)) {
return@outForeach
}
}
outForeach@
sum += checkSet.size
如您所见,我正在尝试以无限顺序执行此操作。 Kotlin不接受此,因为outForeach是一个未解决的参考。但这也不起作用:
val checkSet = mutableSetOf<Int>()
generateSequence{ Random.nextInt(n)}.forEach {
if(!checkSet.add(it)) {
return@forEach
}
}
sum += checkSet.size
这将再次开始forEach循环。有没有办法将某种东西实现为forEachUntil?
p.s。我知道这很像这个问题:'return' doesn't jump out of forEach in Kotlin只是我没有真正得到答案,也不知道它是否适用于此。对我来说,另外一种实现forEachUntil的方法似乎更加优雅
答案 0 :(得分:1)
我想我自己找到了解决方法:
val checkSet = mutableSetOf<Int>()
generateSequence{ Random.nextInt(n)}.first { !checkSet.add(it) }
sum += checkSet.size
基本上使用函数first()并保持返回false直到您要退出循环。只需删除函数first()的返回值
答案 1 :(得分:1)
您可能要考虑使用的替代方案,而不是first
:
使用没有正文的简单while
:
Long
使用带有标签的run
:
long
也许也takeWhile
会有所帮助。但是,在这种特定情况下,肯定不是(因为它会检查while (checkSet.add(Random.nextInt(n))); // <- that semicolon is required! otherwise you execute what is coming next within the while
并给我们留下未消耗的序列...但是,如果条件不同,则考虑某些事情可能很有意义例如take
,takeWhile
,takeLast
等):
run outForeach@{
generateSequence{ Random.nextInt(n)}.forEach {
if(!checkSet.add(it)) {
return@outForeach
}
}
}