Scala 如何通过1的位置列表解码0和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
列表[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)