0

再一次,我坚持使用 Scala 和键/值对的想法。同样,我想以某种方式使用 Option。这一次,我坚持如何根据其密钥删除一对,并且仅删除该密钥的第一个实例(不是全部)。我试图使用filterfilterNot但这会删除所有共享相同密钥的对。此外,再次尝试仅使用 aList来实现它以使其保持半简单

4

3 回答 3

0

Seq 有一个名为的方法find,它完全符合您的要求:

def find(p: (A) ⇒ Boolean): Option[A]

查找满足谓词的序列的第一个元素(如果有)。

注意:对于无限大小的集合,可能不会终止。

    p 用于测试元素的谓词。

    返回包含第一个元素的选项值
                满足 p 的序列,如果不存在,则为 None。

用法:

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
于 2013-09-25T01:25:37.610 回答
0
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))

diff将仅删除参数列表中找到的每个元素的第一个实例,而不是全部删除filter

于 2013-09-25T01:26:31.347 回答
0

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

大概是这样的吧?

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))
于 2013-09-25T01:01:39.397 回答