2017-04-04 123 views
0

共同因素,我们需要找到一个整数列表所有常见因素:找到斯卡拉

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的式的解决方案?

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

若要正确格式化较大的作品,请用四个空格缩进。背包是用于小型单行代码的。 – Carcigenicate

回答

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,因为公因数不会大于任何数字。

+1

非常感谢!当然是b.min - 我的不好。相应更新。 – Roman