我们需要找到整数列表的所有常见因素:
val b = List(4, 8, 12)
b: List[Int] = List(4, 8, 12)
获取列表中的最小值:
val min_b = b.min
min_b: Int = 4
迭代1到min_b的范围并检查b中的每个元素是否可被迭代器的当前值整除,但输出包含空AnyVals
:
val factors_of_b = (1 to min_b)
.map { x => if (b.forall{ z => z % x == 0 }) x }
结果:
factors_of_b: scala.collection.immutable.IndexedSeq[AnyVal] = Vector(1, 2, (), 4)
产生零代替不适用的因素并将结果过滤为零是一种解决方法,但是可能存在更清晰,更Scala-esque的解决方案?
val factors_of_b = (1 to min_b)
.map { x => if(b.forall{ z => z % x == 0 }) x else 0 }
.filterNot(_ == 0)
结果:
factors_of_b: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 4)
答案 0 :(得分:3)
你想要的是filter
:
scala> val b = List(4, 8, 12)
b: List[Int] = List(4, 8, 12)
scala> (1 to b.max).filter { x => b.forall{ z => z % x == 0 } }
res3: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 4)
此外,我不确定为什么要在b.max
而不是b.min
之前进行迭代,因为公共因子不会超过任何数字。