如何解决如何将元素随机插入列表
给定List[Int]
l,如何将新元素elem
随机插入List[Int]
l中?
def randomInsert(l: List[Int],elem: Int): List[Int] = ???
解决方法
这可以通过以下方法完成:首先,从列表中选择一个随机索引,然后选择inserting the new element at that index。另外,这可以通过通用方式完成:
import scala.util.Random
def randomInsert[A](l: List[A],elem: A): List[A] = {
val random = new Random
val randomIndex = random.nextInt(l.length + 1)
l.patch(randomIndex,List(elem),0)
}
用法:
scala>randomInsert(List(1,2,3,4,5),100)
res2: List[Int] = List(1,5,100)
scala>randomInsert(List(1,100)
res3: List[Int] = List(100,1,5)
scala>randomInsert(List(1,100)
res4: List[Int] = List(1,100,5)
我们可以使用此方法递归添加几个元素:
import scala.util.Random
import scala.annotation.tailrec
def randomInsert[A](l: List[A],elem: A,elems: A*): List[A] = {
val random = new Random
@tailrec
def loop(elemToInsert: List[A],acc: List[A]): List[A] =
elemToInsert match {
case Nil => acc
case head :: tail =>
val randomIndex = random.nextInt(acc.length + 1)
loop(tail,acc.patch(randomIndex,List(head),0))
}
loop(elem :: elems.toList,l)
}
用法:
scala>randomInsert(List(1,101,102)
res10: List[Int] = List(1,102)
scala>randomInsert(List(1,102)
res11: List[Int] = List(1,102,102)
res12: List[Int] = List(1,101)
编辑: 根据评论,一种更有效的方法是同时加入两个列表并重新组合合并的一个-注意,这样做可能会丢失列表的原始顺序:
import scala.util.Random
def randomInsert[A](l: List[A],elems: A*): List[A] = {
Random.shuffle((elem :: elems.toList) reverse_::: l)
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。