【问题标题】:Scala: Removing key/value pair from listScala:从列表中删除键/值对
【发布时间】:2013-09-24 23:57:32
【问题描述】:

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

【问题讨论】:

  • 依赖于执行顺序和“第一”听起来有点procedural而不是functional
  • 因为这看起来像是家庭作业,并且您的目标是在使用 List 时尽可能地发挥功能,所以我将向您指出 Listspan 函数。想一想如何将它返回的元组分解为(头、尾)以及如何处理它们。
  • @ThomasW 一点也不。 List 是一个有序结构,因此“first”在该结构方面是明确定义的,与添加/访问项目的执行顺序无关。

标签: list scala key keyvaluepair


【解决方案1】:

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

大概是这样的吧?

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 remove(key:String):Option[Any]”是我正在尝试做的事情
  • 嗯...列表在哪里发挥作用?
  • 这个列表是我在别处定义的。示例 List(("A",1),("B",2),("C",3)) 其中字母是“键”,数字是“值”。
【解决方案2】:
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 那样全部删除。

【讨论】:

    【解决方案3】:

    Seq has a method called 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-27
      • 1970-01-01
      • 2014-03-24
      • 1970-01-01
      • 2014-09-06
      相关资源
      最近更新 更多