列表模式匹配以返回所有其他元素的新列表

时间:2019-05-14 22:25:04

标签: scala pattern-matching

我需要编写一个函数,该函数接受一个列表,例如(“ 1”,“ 2”,“ 3”),然后使用模式匹配将该列表中的所有其他元素返回到新列表中。获取列表的head元素然后查找其他所有元素的正确case语句是什么。

def everyOther[A](list: List[A]): List[A] =
     list match {
     case   _ => Nil
     case x::xs => 
}

它应该从head元素开始返回每个第二个元素的新列表

3 个答案:

答案 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
         )    
    }
}