加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala插入到特定位置的列表中

发布时间:2020-12-16 19:02:39 所属栏目:安全 来源:网络整理
导读:这是我解决的问题,但是作为一个完整的 Scala noob,我觉得我发现一些完全不优雅的东西.任何改善的想法赞赏. val l1 = 4 :: 1 :: 2 :: 3 :: 4 :: Nil // original listval insert = List(88,99) // list I want to insert on certain places// method that fin
这是我解决的问题,但是作为一个完整的 Scala noob,我觉得我发现一些完全不优雅的东西.任何改善的想法赞赏.

val l1 = 4 :: 1 :: 2 :: 3 :: 4 :: Nil // original list
val insert = List(88,99) // list I want to insert on certain places

// method that finds all indexes of a particular element in a particular list
def indexesOf(element:Any,inList:List[Any]) = {
        var indexes = List[Int]()
        for(i <- 0 until inList.length) {
                if(inList(i) == element) indexes = indexes :+ i
        }
        indexes
}


var indexes = indexesOf(4,l1) // get indexes where 4 appears in the original list

println(indexes)

var result = List[Any]()

// iterate through indexes and insert in front
for(i <- 0 until indexes.length) {
        var prev = if(i == 0) 0 else indexes(i-1)
        result = result ::: l1.slice(prev,indexes(i)) ::: insert
}
result = result ::: l1.drop(indexes.last) // append the last bit from original list

println(result)

我认为更优雅的解决方案可以用这样的东西实现,但这只是纯粹的猜测.

var final:List[Any] = (0 /: indexes) {(final,i) => final ::: ins ::: l1.slice(i,indexes(i))

解决方法

def insert[A](xs: List[A],extra: List[A])(p: A => Boolean) = {
  xs.map(x => if (p(x)) extra ::: List(x) else List(x)).flatten
}

scala> insert(List(4,1,2,3,4),List(88,99)){_ == 4}
res3: List[Int] = List(88,99,4,88,4)

编辑:添加说明.

我们的目标是在另一个列表中的所选元素前面插入一个列表(称为extra)(这里称为xs – 通常用于列表,好像有一件事是x,那么很多它们必须是复数x).我们希望这可以在任何类型的列表上工作,所以我们用通用类型[A]注释它.

哪些元素是插入的候选者?在写函数时,我们不知道,所以我们为每个元素(p:A => Boolean)提供一个表示true或false的函数.

现在,对于列表x中的每个元素,我们检查 – 我们应该进行插入(即p(x)为真)?如果是,我们只是构建它:extra ::: List(x)只是单个项目x的附加元素. (可能更好的是写这个额外的:x – 添加单个项目在最后.)如果否,我们只有单个项目,但我们使其列表(x)而不是只是x,因为我们想要的一切具有相同的类型.所以现在,如果我们有这样的东西

4 1 2 3 4

我们的条件是我们在4之前插入5 6,我们生成

List(5 6 4) List(1) List(2) List(3) List(5 6 4)

这正是我们想要的,除了我们有列表的列表.为了摆脱内部列表并将所有内容都压成一个列表,我们只需调用flatten.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读