我有一个相当大的集合,我想迭代并找出该集合是否包含多个特定数字的实例。由于收集很大,我想提前退出,即不要遍历整个清单。
我有一个看起来很脏的代码,它以非功能性编程方式完成。但是,我无法找到这样做的函数编程方式(在Groovy或Scala中),因为我需要同时做两件事。
“累积状态”可以使用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)
答案 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)
仅扫描集合,直到找到第二个目标元素。