返回/突破kotlin中的无限foreach

时间:2018-12-12 13:44:28

标签: foreach kotlin return infinite

对于班级,我必须编写一个计算生日问题的程序 现在,我尝试同时学习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的方法似乎更加优雅

2 个答案:

答案 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 并给我们留下未消耗的序列...但是,如果条件不同,则考虑某些事情可能很有意义例如taketakeWhiletakeLast等):

    run outForeach@{
      generateSequence{ Random.nextInt(n)}.forEach {
        if(!checkSet.add(it)) {
          return@outForeach
        }
      }
    }