Scala插入到特定位置的列表中
这是我解决的问题,但是作为一个完整的
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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |