Replace element in List with scala

后端 未结 7 1109
花落未央
花落未央 2021-02-01 00:45

How do you replace an element by index with an immutable List.

E.g.

val list = 1 :: 2 ::3 :: 4 :: List()

list.replace(2, 5)
相关标签:
7条回答
  • 2021-02-01 01:10

    You can use list.updated(2,5) (which is a method on Seq).

    It's probably better to use a scala.collection.immutable.Vector for this purpose, becuase updates on Vector take (I think) constant time.

    0 讨论(0)
  • 2021-02-01 01:18

    In addition to what has been said before, you can use patch function that replaces sub-sequences of a sequence:

    scala> val list = List(1, 2, 3, 4)
    list: List[Int] = List(1, 2, 3, 4)
    
    scala> list.patch(2, Seq(5), 1) // replaces one element of the initial sequence
    res0: List[Int] = List(1, 2, 5, 4)
    
    scala> list.patch(2, Seq(5), 2) // replaces two elements of the initial sequence
    res1: List[Int] = List(1, 2, 5)
    
    scala> list.patch(2, Seq(5), 0) // adds a new element
    res2: List[Int] = List(1, 2, 5, 3, 4)
    
    0 讨论(0)
  • 2021-02-01 01:18

    It can also be achieved using patch function as

    scala> var l = List(11,20,24,31,35)
    
    l: List[Int] = List(11, 20, 24, 31, 35)
    
    scala> l.patch(2,List(27),1)
    
    res35: List[Int] = List(11, 20, 27, 31, 35)
    

    where 2 is the position where we are looking to add the value, List(27) is the value we are adding to the list and 1 is the number of elements to be replaced from the original list.

    0 讨论(0)
  • 2021-02-01 01:24

    If you do a lot of such replacements, it is better to use a muttable class or Array.

    0 讨论(0)
  • 2021-02-01 01:26

    If you want to replace index 2, then

    list.updated(2,5)    // Gives 1 :: 2 :: 5 :: 4 :: Nil
    

    If you want to find every place where there's a 2 and put a 5 in instead,

    list.map { case 2 => 5; case x => x }  // 1 :: 5 :: 3 :: 4 :: Nil
    

    In both cases, you're not really "replacing", you're returning a new list that has a different element(s) at that (those) position(s).

    0 讨论(0)
  • 2021-02-01 01:31

    You can use map to generate a new list , like this :

    @ list
    res20: List[Int] = List(1, 2, 3, 4, 4, 5, 4)
    @ list.map(e => if(e==4) 0 else e)
    res21: List[Int] = List(1, 2, 3, 0, 0, 5, 0)
    
    0 讨论(0)
提交回复
热议问题