查找Scala中的常见因素

时间:2017-04-04 00:07:27

标签: scala functional-programming factors

我们需要找到整数列表的所有常见因素:

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)

1 个答案:

答案 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之前进行迭代,因为公共因子不会超过任何数字。