.contains() 方法抛出 java.util.NoSuchElementException

Jae*_*Jae 0 collections scala

我正在尝试删除列表中出现的 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  
    }
}
Run Code Online (Sandbox Code Playgroud)

错误信息

    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)
    

Run Code Online (Sandbox Code Playgroud)

Gur*_*ron 5

这不是contains抛出的问题 - 您正在尝试从地图中获取元素,然后再检查它是否会在那里:

val elemCount = xs.groupBy(identity).mapValues(_.size)(elem)
Run Code Online (Sandbox Code Playgroud)

只需就地计算元素:

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  
    }
}
Run Code Online (Sandbox Code Playgroud)