【问题标题】:Groovy/Scala - Abort Early while iterating using an accumulatorGroovy/Scala - 使用累加器迭代时提前中止
【发布时间】:2017-04-26 12:57:25
【问题描述】:

我有一个相当大的集合,我想迭代并找出该集合是否包含多个特定数字的实例。由于集合很大,我想提前退出,即不遍历完整列表。

我有一段看起来很脏的代码,它以非函数式编程方式执行此操作。但是,我无法找到执行此操作的函数式编程方式(在 Groovy 或 Scala 中),因为我需要同时做两件事。

  1. 累积状态
  2. 提前退出

“累积状态”可以使用 Groovy/Scala 中的“注入”或“折叠”方法完成,但无法提前退出这些方法。原始的常规代码如下。有什么想法吗?

def collection = [1,2,3,2,4,6,0,65,... 1 million more numbers]
def n = 2

boolean foundMoreThanOnce(List<Integer> collection, Integer n) {
    def foundCount = 0
    for(Integer i : collection) {
        if(i == n) {
            foundCount = foundCount + 1
        }

        if(foundCount > 1) {
            return true
        }
    }
    return false    
}

print foundMoreThanOnce(collection, n)

【问题讨论】:

    标签: scala groovy functional-programming


    【解决方案1】:

    许多可能的 Scala 解决方案之一。

    def foundMoreThanOnce[A](collection: Seq[A], target: A): Boolean =
      collection.dropWhile(_ != target).indexOf(target,1) > 0
    

    或略有不同...

      collection.dropWhile(target.!=).drop(1).contains(target)
    

    仅在找到第二个目标元素之前扫描集合。

    【讨论】:

      【解决方案2】:

      不确定 groovy,但如果您可以使用 Java 8,那么就有可能

      collection.stream().filter(z -> {return z ==2;} ).limit(2)
      

      一旦第二次出现 2,限制将停止流处理。

      您可以按如下方式使用它,以确保准确出现两次

      Long occ = collection.stream().filter(z -> {return z ==2;} ).limit(2).count();
      
      if(occ == 2)
          return true;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-30
        • 2011-11-28
        • 2018-03-06
        相关资源
        最近更新 更多