我是Scala的新手,我知道必须有一个很好的方法来做到这一点,但我无法想出一些好的和可读的东西。
我有一组id(字符串),对于每个id,我运行一些返回布尔值的函数。
结果是Set [Boolean],但我想创建一个包含两个数字的元组,一个是true,一个是false。
这是一个干净/可读的方法吗?
答案 0 :(得分:5)
鉴于您的ids
和f
:
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)