scala .contains()方法抛出java.util.NoSuchElementException异常

1szpjjfi  于 2023-01-17  发布在  Scala
关注(0)|答案(2)|浏览(176)

我试图删除列表中出现n次的给定元素(不是所有的!)。我面临的问题是当我试图分支到列表包含给定元素或不包含给定元素的两种情况时。我的if语句给了我一个标题中描述的错误。我该如何解决这个问题?
我的代码

def removeN[A](xs: List[A], elem: A, n: Int) : List[A] = {
    val elemCount = xs.groupBy(identity).mapValues(_.size)(elem)
    if (xs.contains(elem) == false)
      xs
    else if (elemCount == n) 
      xs.filterNot(x => x == elem)
    else {
      val (left, right) = xs.span(_ != elem)
      print(s"$left and $right")
      left ::: right.tail  
    }
}

错误信息

removeN(List(1,2,3,2,1), 0, 2)
    
    java.util.NoSuchElementException: key not found: 0
    at scala.collection.MapOps.default(Map.scala:274)
    at scala.collection.MapOps.default$(Map.scala:273)
    at scala.collection.AbstractMapView.default(MapView.scala:186)
    at scala.collection.MapOps.apply(Map.scala:176)
    at scala.collection.MapOps.apply$(Map.scala:175)
    at scala.collection.AbstractMapView.apply(MapView.scala:186)
    at removeN(<console>:3)
    ... 32 elided

Test Case
removeN(List(1,2,3,2,1), 0, 2)  // => List(1, 2, 3, 2, 1)
k5ifujac

k5ifujac1#

抛出的不是contains-您尝试在检查元素是否存在之前从map中获取该元素:

val elemCount = xs.groupBy(identity).mapValues(_.size)(elem)

仅计算原地元素:

def removeN[A](xs: List[A], elem: A, n: Int) : List[A] = {
    if (xs.contains(elem) == false) xs
    else if (xs.count(_ == elem) == n) xs.filterNot(x => x == elem)
    else {
        val (left, right) = xs.span(_ != elem)
        print(s"$left and $right")
        left ::: right.tail  
    }
}
xesrikrc

xesrikrc2#

我想,我遗漏了一些东西,但是您的函数(在修复了另一个答案中提到的bug之后)似乎删除了所有的示例,如果它们正好有n个,或者 * 只有第一个 * 示例,否则(它也非常低效,涉及到对列表的多次冗余遍历)。
下面是一个(更有效的)版本,删除了前N个匹配项,假设这就是你实际想要的:

def removeN[A](xs: List[A], elem: A, n: Int, result: List[A]=Nil): List[A] = xs match {
    case Nil => result.reverse
    case `elem`::tail if n > 0 => removeN(tail, elem, n-1 result)
    case head::tail => removeN(tail, elem, n, head::result)
 }

这可以通过为n==0 && result == Nil添加一个“快捷方式”的特殊情况来进一步略微改进,但似乎不值得付出这样的努力,也不值得损失可读性。

相关问题