Scala 创建一个列表,其中包含特定索引处的一些数据和所有其余索引处的 0
Scala creating a list with some data at specific indices and 0 at all the rest indices
我有一个名为 positiveDays
的列表,其中包含值 (2,4,6),我想创建一个列表 DaysDetails
,所有 positiveDays
索引的值为 1其余指数为 0。
示例 -
positiveDays(2,4,6)
O/p 列表 -> DaysDetails(0,0,1,0,1,0,1)
任何人都可以建议我一种不使用 var 的方法吗?
您可以将 "special" 天数放入列表中,然后映射所有工作日并检查它是否是您的 "special" 天之一。
val positiveDays = List(2,4,6)
(0 to 6) map { i =>
if (positiveDays.contains(i)) 1
else 0
}
res1: scala.collection.immutable.IndexedSeq[Int] = Vector(0, 0, 1, 0, 1, 0, 1)
当然,如果你只对偶数天感兴趣,那么你可以这样:
(0 to 6) map { i =>
if (i % 2 == 0) 1
else 0
}
如果您想从星期一而不是星期日开始新的一周,请使用 1 to 7
而不是 0 to 6
。
这应该有效(仅当 positiveDays
列表不为空时):
val positiveDays = List(2,4,6)
List.tabulate(1 + positiveDays.last) {
pos => if (positiveDays.contains(pos)) 1 else 0
}
要正确处理 positiveDays
为空的情况,您可以使用:
List.tabulate(positiveDays.lastOption.fold(0)(1 + _)) {
pos => if (positiveDays.contains(pos)) 1 else 0
}
给这只猫剥皮的方法有很多,但我认为这个方法简洁明了:
val positiveDays = Set(2,3,6)
for (i<- 0 to 6)
yield if (positiveDays(i)) 1 else 0
我认为使用 Int
来表示星期几是错误的。有 Int.MinValue + Int.MaxValue
Int
个,但一周有 7 天。
666
代表星期几? -42
怎么样?
scala> sealed trait DayOfWeek
defined trait DayOfWeek
scala> case object Monday extends DayOfWeek
defined object Monday
scala> case object Tuesday extends DayOfWeek
defined object Tuesday
// I excluded the rest for conciseness
scala> val positiveDays: List[DayOfWeek] = List(Tuesday)
positiveDays: List[DayOfWeek] = List(Tuesday)
scala> val AllDays: List[DayOfWeek] = List(Monday, Tuesday)
AllDays: List[DayOfWeek] = List(Monday, Tuesday)
scala> AllDays.map(d => if (positiveDays.contains(d)) (d, 1) else (d,0) )
res0: List[(DayOfWeek, Int)] = List((Monday,0), (Tuesday,1))
我有一个名为 positiveDays
的列表,其中包含值 (2,4,6),我想创建一个列表 DaysDetails
,所有 positiveDays
索引的值为 1其余指数为 0。
示例 -
positiveDays(2,4,6)
O/p 列表 -> DaysDetails(0,0,1,0,1,0,1)
任何人都可以建议我一种不使用 var 的方法吗?
您可以将 "special" 天数放入列表中,然后映射所有工作日并检查它是否是您的 "special" 天之一。
val positiveDays = List(2,4,6)
(0 to 6) map { i =>
if (positiveDays.contains(i)) 1
else 0
}
res1: scala.collection.immutable.IndexedSeq[Int] = Vector(0, 0, 1, 0, 1, 0, 1)
当然,如果你只对偶数天感兴趣,那么你可以这样:
(0 to 6) map { i =>
if (i % 2 == 0) 1
else 0
}
如果您想从星期一而不是星期日开始新的一周,请使用 1 to 7
而不是 0 to 6
。
这应该有效(仅当 positiveDays
列表不为空时):
val positiveDays = List(2,4,6)
List.tabulate(1 + positiveDays.last) {
pos => if (positiveDays.contains(pos)) 1 else 0
}
要正确处理 positiveDays
为空的情况,您可以使用:
List.tabulate(positiveDays.lastOption.fold(0)(1 + _)) {
pos => if (positiveDays.contains(pos)) 1 else 0
}
给这只猫剥皮的方法有很多,但我认为这个方法简洁明了:
val positiveDays = Set(2,3,6)
for (i<- 0 to 6)
yield if (positiveDays(i)) 1 else 0
我认为使用 Int
来表示星期几是错误的。有 Int.MinValue + Int.MaxValue
Int
个,但一周有 7 天。
666
代表星期几? -42
怎么样?
scala> sealed trait DayOfWeek
defined trait DayOfWeek
scala> case object Monday extends DayOfWeek
defined object Monday
scala> case object Tuesday extends DayOfWeek
defined object Tuesday
// I excluded the rest for conciseness
scala> val positiveDays: List[DayOfWeek] = List(Tuesday)
positiveDays: List[DayOfWeek] = List(Tuesday)
scala> val AllDays: List[DayOfWeek] = List(Monday, Tuesday)
AllDays: List[DayOfWeek] = List(Monday, Tuesday)
scala> AllDays.map(d => if (positiveDays.contains(d)) (d, 1) else (d,0) )
res0: List[(DayOfWeek, Int)] = List((Monday,0), (Tuesday,1))