例如,如果我有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)
但我觉得我错过了一个更简单的解决方案,如果是这样,我错过了什么?
答案 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)
您可以zipWithIndex
和filter
删除要删除的索引。
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 + map
是collect
,
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)