How to remove an item from a list in Scala having only its index?
Solution 1
Simply use
val trunced = internalIdList.take(index) ++ internalIdList.drop(index + 1)
This will also work if index is larger than the size of the list (It will return the same list).
Solution 2
There is a .patch
method on Seq
, so in order to remove the third element you could simply do this:
List(11, 12, 13, 14, 15).patch(2, Nil, 1)
Which says: Starting at index 2, please remove 1 element, and replace it with Nil.
Knowing this method in depth enables you to do so much more than that. You can swap out any sublist of a list with arbitrary other.
Solution 3
An idiomatic way to do it is to zip the value with their index, filter, and then project the value again:
scala> List(11,12,13,14,15).zipWithIndex.filter(_._2 != 2).map(_._1)
res0: List[Int] = List(11, 12, 14, 15)
But you can also use splitAt
:
scala> val (x,y) = List(11,12,13,14,15).splitAt(2)
x: List[Int] = List(11, 12)
y: List[Int] = List(13, 14, 15)
scala> x ++ y.tail
res5: List[Int] = List(11, 12, 14, 15)
Solution 4
If you insist on using the oldschool method, use collect:
List(1,2,3,4).zipWithIndex.collect { case (a, i) if i != 2 => a }
However, I still prefer the method in my other answer.
Solution 5
A generic function that implements Nicolas' first solution:
def dropIndex[T](list: List[T], idx: Int): List[T] =
list.zipWithIndex.filter(_._2 != idx).map(_._1)
Usage:
scala> val letters = List('a', 'b', 'c')
scala> for (i <- 0 until letters.length) println(dropIndex(letters, i))
List(b, c)
List(a, c)
List(a, b)
Related videos on Youtube
YoBre
I'm an italian web developer. Currently working with Angular, Coffee scripts and Javascript. I love photography and video editing.
Updated on September 02, 2020Comments
-
YoBre over 3 years
I have a list as follows:
val internalIdList: List[Int] = List() internalIdList = List(11, 12, 13, 14, 15)
From this list would remove the third element in order to obtain:
internalIdList = List(11, 12, 14, 15)
I can not use a
ListBuffer
, are obliged to maintain the existing structure. How can I do?Thanks to all
-
Nicolas over 10 yearsThe if/else is useless: take and drop will behave as expected if the given index is greater than the size.
-
Kevin eyeson over 3 yearsThis is amazing!
-
Rok Kralj over 3 yearsGlad you like it, still, I suggest my .patch() answer. ;)