我需要编写一个函数,该函数接受一个列表,例如(“ 1”,“ 2”,“ 3”),然后使用模式匹配将该列表中的所有其他元素返回到新列表中。获取列表的head元素然后查找其他所有元素的正确case语句是什么。
def everyOther[A](list: List[A]): List[A] =
list match {
case _ => Nil
case x::xs =>
}
它应该从head元素开始返回每个第二个元素的新列表
答案 0 :(得分:5)
求助。
null
答案 1 :(得分:2)
这是另一种涉及使用grouped
来捕获列表中从其第一个元素开始的其他元素的方法:
def everyOther[A](list: List[A]): List[A] =
list.grouped(2).map(_.head).toList
everyOther(List(1, 2, 3, 4, 5))
// res1: List[Int] = List(1, 3, 5)
要捕获从第二个元素开始的所有其他元素,请将列表替换为其tail
:
def everyOther2[A](list: List[A]): List[A] =
list.tail.grouped(2).map(_.head).toList
或用map
部分功能将collect
替换为case/match
:
def everyOther2[A](list: List[A]): List[A] =
list.grouped(2).collect{ case List(_, x) => x }.toList
答案 2 :(得分:1)
其他答案也不错,但是这个kata很有趣,以至于我只想添加自己的解决方案:
创建提取器对象:
$ sudo ip link set dev enp0s8 xdp object clone.o sec action
Prog section 'action' rejected: Permission denied (13)!
- Type: 6
- Instructions: 41 (0 over limit)
- License: GPL
Verifier analysis:
0: (bf) r2 = r1
1: (7b) *(u64 *)(r10 -16) = r1
2: (79) r1 = *(u64 *)(r10 -16)
3: (61) r1 = *(u32 *)(r1 +76)
invalid bpf_context access off=76 size=4
Error fetching program/map!
然后将其用于模式匹配:
object EveryOther {
def unapply[A](list: List[A]): Option[List[A]] = {
Some(
Stream.iterate(true)(!_) //create lazy infinite stream of true,false,true...
.zip(list)
.flatMap{
case (true, x) => Some(x) //filter to take only odd tuples with true
case _ => None //could be replaced with Option.when from scala 2.13
}.toList
)
}
}