List Scala:从列表中删除键/值对

List Scala:从列表中删除键/值对,list,scala,key,keyvaluepair,List,Scala,Key,Keyvaluepair,再一次,我坚持Scala和键/值对的想法。同样,我想以某种方式使用Option。这一次,我被困在如何根据密钥移除一对,并且只移除该密钥的第一个实例(不是全部)。我试图使用filter和filterNot,但这会删除共享同一密钥的所有对。此外,再次尝试通过一个列表来实现这一点,以保持它的半简单性很难说出你在问什么。如果您写出了您试图编写的函数的签名,这会有所帮助 也许是这样的 def remove[A, B](seq: Seq[(A, B)], key: A): Seq[(A, B)] =

再一次,我坚持Scala和键/值对的想法。同样,我想以某种方式使用Option。这一次,我被困在如何根据密钥移除一对,并且只移除该密钥的第一个实例(不是全部)。我试图使用
filter
filterNot
,但这会删除共享同一密钥的所有对。此外,再次尝试通过一个
列表来实现这一点,以保持它的半简单性

很难说出你在问什么。如果您写出了您试图编写的函数的签名,这会有所帮助

也许是这样的

def remove[A, B](seq: Seq[(A, B)], key: A): Seq[(A, B)] = 
  seq.indexWhere(_._1 == key) match { 
    case -1 => seq
    case n => seq.patch(n, Nil, 1)
  }

remove(Seq((1,2), (2,3), (3,4), (2,5)), 2)
// List((1,2), (3,4), (2,5))

remove(Seq((1,2), (2,3), (3,4), (2,5)), 6)
// List((1,2), (2,3), (3,4), (2,5))
这正是你要问的:

def find(p: (A) ⇒ Boolean): Option[A] Finds the first element of the sequence satisfying a predicate, if any. Note: may not terminate for infinite-sized collections. p the predicate used to test elements. returns an option value containing the first element in the sequence that satisfies p, or None if none exists.
diff
将只删除参数列表中每个元素的第一个实例,而不是像
filter
那样删除所有元素。

依赖执行顺序&“first”听起来是程序性的,而不是功能性的。因为这看起来像是家庭作业,而且您的目标是在使用
列表时尽可能地发挥功能,我将向您介绍
List
span
功能。想一想如何将返回的元组分解为(头、尾)以及如何处理它们。@ThomasW一点也不<代码>列表
是一个有序结构,因此“first”在该结构中定义得很好,与添加/访问项目的执行顺序无关。对不起,我忘了在中添加它。“def remove(key:String):Option[Any]”是我试图告诉你的。。。清单在哪里起作用?清单是我在别处定义的东西。示例列表((“A”,1),(“B”,2),(“C”,3)),其中字母是“键”,数字是“值”。
val list = List(("A",1),("B",2),("C",3))

def remove(key:String): Option[Int] = list.find(_._1 == key)

remove("B")
// Some((B,2))

remove("D")
// None
val list = List(1 -> 'a, 2 -> 'b, 2 -> 'c)

val removal = list find (_._1 == 2)
  // Option[(Int, Symbol)] = Some((2,'b))
val newList = list diff removal.toList
  // List[(Int, Symbol)] = List((1,'a), (2,'c))