Groovy / Scala - 在使用累加器进行迭代时尽早中止

时间:2017-04-26 03:10:12

标签: scala groovy functional-programming

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

我有一个看起来很脏的代码,它以非功能性编程方式完成。但是,我无法找到这样做的函数编程方式(在Groovy或Scala中),因为我需要同时做两件事。

  1. 累积状态
  2. 提前退出
  3. “累积状态”可以使用Groovy / Scala中的“inject”或“fold”方法完成,但是没有办法从这些方法中提前退出。原始groovy代码如下。有什么想法吗?

    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)
    

2 个答案:

答案 0 :(得分:1)

不确定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;

答案 1 :(得分: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)

仅扫描集合,直到找到第二个目标元素。