Scala列表的上三角循环习语
从命令式编程的背景来看,我已经习惯了
for (i = 0; i < 1000000; i++) { for (j = i + 1; j < 1000000; j++) { doSomething(array[i],array[j]) } } 检查百万元素数组中的所有唯一对. doSomething是一些操作,在对角线上产生对角线和对称或反对称结果的微不足道的结果 – 这就是为什么我只想在上三角形上工作. (这里有一个小变体,其中i == j的情况很有趣;这很容易解决.) 我发现自己奇怪地试图在Scala中做这件事.我有一个大型列表,并希望对所有成对组合做一些事情,但是 list.flatMap(x => list.map(y => doSomething(x,y)) 包括所有冗余或琐碎的案例(两个太多的工作因素)和 (0 until 1000000).flatMap({i => (0 until 1000000).map({j => doSomething(list(i),list(j)) }) }) 会是非常错误的,因为列表不是随机访问(N ^ 2因子太多的工作).我可以将我的列表转换为数组,但感觉它错过了重点.列表是链接列表,因此我的命令示例中的j 1元素距离我正在检查的i只有一步之遥.我敢肯定我可以用C / Python /中的链接列表编写一个有效的上三角循环. 我想我现在可以吞下两个因子,但这是一个常见的情况,因为感觉应该有一个很好的解决方案. 此外,这个“上三角形环”是否有一个共同的名称?我找不到一个好的搜索字符串. 编辑:这是一个糟糕的解决方案的例子: list.zipWithIndex.flatMap({case (x,i) => list.zipWithIndex.map({case (y,j) => if (j > i) doSomething(x,y) else Nil }) }) 因为它仍然访问不需要的节点. 解决方法
您可能希望查看
Vector数据类型,它允许基于快速索引的查找.
此外,还有一个内置的组合方法,可以为您提供您正在寻找的样子. scala> (1 to 3).combinations(2).mkString(" ") res1: String = Vector(1,2) Vector(1,3) Vector(2,3) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |