从Scala列表中删除一个元素

时间:2017-06-03 04:01:38

标签: scala

例如,如果我有List(1,2,1,3,2)的列表,并且我只想删除一个1,那么我得到List(2,1,3,2)。如果删除了其他1,那就没问题了。

我的解决方案是:

scala> val myList = List(1,2,1,3,2)
myList: List[Int] = List(1, 2, 1, 3, 2)

scala> myList.patch(myList.indexOf(1), List(), 1)
res7: List[Int] = List(2, 1, 3, 2)

但我觉得我错过了一个更简单的解决方案,如果是这样,我错过了什么?

3 个答案:

答案 0 :(得分:5)

肯定不简单:

def rm(xs: List[Int], value: Int): List[Int] = xs match {
  case `value` :: tail =>  tail
  case x :: tail => x :: rm(tail, value)
  case _ => Nil
}

使用:

scala> val xs = List(1, 2, 1, 3)
xs: List[Int] = List(1, 2, 1, 3)

scala> rm(xs, 1)
res21: List[Int] = List(2, 1, 3)

scala> rm(rm(xs, 1), 1)
res22: List[Int] = List(2, 3)

scala> rm(xs, 2)
res23: List[Int] = List(1, 1, 3)

scala> rm(xs, 3)
res24: List[Int] = List(1, 2, 1)

答案 1 :(得分:3)

您可以zipWithIndexfilter删除要删除的索引。

scala> val myList = List(1,2,1,3,2)
myList: List[Int] = List(1, 2, 1, 3, 2)

scala> myList.zipWithIndex.filter(_._2 != 0).map(_._1)
res1: List[Int] = List(2, 1, 3, 2)

filter + mapcollect

scala> myList.zipWithIndex.collect { case (elem, index) if index != 0 => elem }
res2: List[Int] = List(2, 1, 3, 2)

要删除第一次出现的elem,您可以在第一次出现时拆分,删除该元素并合并回来。

list.span(_ != 1) match { case (before, atAndAfter) => before ::: atAndAfter.drop(1) }

以下是扩展答案,

val list = List(1, 2, 1, 3, 2)

//split AT first occurance
val elementToRemove = 1
val (beforeFirstOccurance, atAndAfterFirstOccurance) = list.span(_ != elementToRemove)

beforeFirstOccurance ::: atAndAfterFirstOccurance.drop(1) // shouldBe List(2, 1, 3, 2)

资源

How to remove an item from a list in Scala having only its index?

How should I remove the first occurrence of an object from a list in Scala?

答案 2 :(得分:0)

列表是不可变的,因此您无法从中删除元素,但可以在将结果分配给新变量时过滤掉您不想要的元素:

scala> val originalList = List(5, 1, 4, 3, 2) 
originalList: List[Int] = List(5, 1, 4, 3, 2) 
scala> val newList = originalList.filter(_ > 2) 
newList: List[Int] = List(5, 4, 3)

您可以将变量声明为var并将操作结果重新分配给自身,而不是将此类操作的结果连续分配给新变量:

scala> var x = List(5, 1, 4, 3, 2) 
x: List[Int] = List(5, 1, 4, 3, 2) 
scala> x = x.filter(_ > 2) 
x: List[Int] = List(5, 4, 3)
相关问题