我想创建一个仅包含0和1的List[Int]
。在数组中定义的零和1的位置
val bitMask = List(2,5,6,11,...,621,655)
bitMask
- 结果列表中的位置列表,结果列表中的项目为零
因此我想得到
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)
可能有一个更简单,更灵便的解决方案吗?
答案 0 :(得分:6)
BitSet将提供更高效的查找(事实上,如果你想使用工会,区别等,它会更好):
val mask = scala.collection.BitSet(2,5,6,11)
(0 to 100).map(mask)
// Vector(false, false, true, false, false, ...)
从布尔值转换为0/1应该是微不足道的
答案 1 :(得分:2)
这是一个带有可变集合(Array)
的版本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)
答案 2 :(得分:0)
以下单行怎么样?
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)