从一组布尔值,如何返回包含真实数字的元组,数字是否为假?

时间:2017-10-26 20:56:29

标签: scala set

我是Scala的新手,我知道必须有一个很好的方法来做到这一点,但我无法想出一些好的和可读的东西。

我有一组id(字符串),对于每个id,我运行一些返回布尔值的函数。

结果是Set [Boolean],但我想创建一个包含两个数字的元组,一个是true,一个是false。

这是一个干净/可读的方法吗?

5 个答案:

答案 0 :(得分:5)

鉴于您的idsf

val ids: Set[String] = ???
def f(s: String): Boolean = ???

以下使用内置的partition函数:

,简明扼要地为您提供了帮助
val (trues, falses) = ids partition f
(trues.size, falses.size)

答案 1 :(得分:2)

您可以使用count的{​​{1}}方法:

Seq

您必须使用val ids: Seq[String] = Seq("1", "12", "3") def containsOne(s: String) = s.contains('1') val processedIds = ids.map(containsOne) // first item is amount of trues, second is amount of falses val count: (Int, Int) = (processedIds.count(identity), processedIds.count(_ == false)) ,因为Seq将会“变平”' out Set的集合(最大大小为2,不允许重复)。

答案 2 :(得分:0)

鉴于你的fn,

scala> def fn(x: String) = x.contains("customer")
fn: (x: String)Boolean

你必须.map来创建boolean -> Set(Id),然后通过布尔值聚合,然后计算每个布尔值的ID数

scala> Set("customerId-1", "customerId-2", "id-3", "id-4")
          .map(x => fn(x) -> x)
          .groupBy(_._1)
          .map { case (boolean, set) => boolean -> set.size }
res51: scala.collection.immutable.Map[Boolean,Int] = Map(false -> 2, true -> 2)

答案 3 :(得分:0)

这是一个表达式,用于计算集合中偶数元素和奇数元素的数量:

Set(3,4,5,6,8,3).toSeq.map{_ % 2 == 0}
    .foldLeft((0,0)){(t,c) => if (c) (t._1+1, t._2) else (t._1, t._2+1)}

toSeq是保持map的输出不仅仅是Set所必需的。

只需通过调用您的函数替换{_ % 2 == 0}

答案 4 :(得分:0)

这是我尝试单线程(除了它在这个小方框中不适合一行:(

如果除以3除以1的余数,则我的测试函数为真,否则为假,并且我在1到6的范围内运行它(即1,2,3,4,5):

scala> val x = (1 to 6).partition(_%3 == 1) match
     | { case (s1,s2) => (s1.length, s2.length) }
x: (Int, Int) = (2,4)

所以,更主要地写一下主要功能,

scala> def boolCounter[T](
   | s: Seq[T],
   | f: T => Boolean): (Integer, Integer) = 
   | s.partition(f) match { case (s1, s2) => (s1.length, s2.length) }
boolCounter: [T](s: Seq[T], f: T => Boolean)(Integer, Integer)

scala> val r = 1 to 6
r: scala.collection.immutable.Range.Inclusive = Range 1 to 6

scala> val f: Int => Boolean = { x => x%3 == 1}
f: Int => Boolean = $$Lambda$1252/1891031939@5a090f62

scala> boolCounter(r, f)
res0: (Integer, Integer) = (2,4)