Scala 中的函数式编程:在多维列表中查找元素的索引
Functional programming in Scala: find index of an element in a multidimensional list
我有一个二维列表ll : List[List[T]]
和一个函数f : T => Boolean
。我想找到一个整数元组 (i, j)
,这样 f(l(i)(j)) == true
无论何时存在,都可能包含在 Option
中,并且想以函数式编程的方式来实现。我当前的工作解决方案如下所示:
ll.zipWithIndex
.flatMap{case (l, i) => l.map((_, i)).zipWithIndex}
.find{case ((l, _), j) => f(l(j))}
.map{case ((_, i), j) => (i, j)}
但是,我觉得应该有更好的方法来实现这一点 - 我的解决方案非常麻烦,并且不能很好地推广到高维数组。那么有没有更好的方法呢?
在我开始之前:我完全知道这可以通过嵌套的 for 循环轻松实现。所以我只对函数式编程风格的解决方案感兴趣。
您没有提供任何示例输入来进行测试,但这似乎有效。它 returns 一个 IndexedSeq[(Int, Int)]
集合, 应该 (我认为)包含所有 (i,j)
对,其中 f(ll(i)(j))
returns 真.
ll.indices
.flatMap(i => ll(i).indices
.collect{case j if f(ll(i)(j)) => (i,j)})
这和这个差不多...
for {
i <- ll.indices
j <- ll(i).indices
if f(ll(i)(j))
} yield (i,j)
...并且,如评论中所述,完全兼容 FP。
(for {
(l, i) <- ll.zipWithIndex
(e, j) <- l.zipWithIndex
if f(e)
} yield (i, j)).headOption