Scala 如何通过1的位置列表解码0和1的列表?

Scala 如何通过1的位置列表解码0和1的列表?,scala,Scala,我想创建一个只包含0和1的列表[Int]。数组中定义的0和1的位置 val bitMask = List(2,5,6,11,...,621,655) 位掩码-是结果列表中位置1的列表,结果列表项的上方为零 因此,我想 result = List(0,0,1,0,0,1,1,0,...,0,1) 将结果的长度计算为bitMask.last+1 我是用这个代码做的: result = List.fill(bitMask.last+1)(0).zipWithIndex.map(i => if

我想创建一个只包含0和1的
列表[Int]
。数组中定义的0和1的位置

val bitMask = List(2,5,6,11,...,621,655)
位掩码
-是结果列表中位置1的列表,结果列表项的上方为零

因此,我想

result = List(0,0,1,0,0,1,1,0,...,0,1)
将结果的长度计算为
bitMask.last+1

我是用这个代码做的:

result = List.fill(bitMask.last+1)(0).zipWithIndex.map(i => if (bitMask.contains(i._2)) 1 else 0)

可能有更简单、更具scala方式的解决方案?

位集将提供更高效的查找(事实上,如果您想使用联合、区别等,它会更优越):


从布尔值到0/1的转换应该很简单

这是一个具有可变集合的版本()


接下来的一班怎么样

scala> val bitMask = List(2,5,6,11)
bitMask: List[Int] = List(2, 5, 6, 11)

scala> bitMask.foldLeft(List.empty[Int]) { (r, e) => r ++ Seq.fill(e - r.size)(0) ++ Seq(1) }
res0: List[Int] = List(0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1)
scala> val bitMask = List(2,5,6,11,15)
bitMask: List[Int] = List(2, 5, 6, 11, 15)

scala> bitMask.foldLeft(Array.fill(bitMask.last+1)(0)){ (arr, x) => arr(x) = 1; arr }.toList
res0: List[Int] = List(0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1)
scala> val bitMask = List(2,5,6,11)
bitMask: List[Int] = List(2, 5, 6, 11)

scala> bitMask.foldLeft(List.empty[Int]) { (r, e) => r ++ Seq.fill(e - r.size)(0) ++ Seq(1) }
res0: List[Int] = List(0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1)