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

scala – 插入的反转是什么,以及如何实现它?

发布时间:2020-12-16 09:06:57 所属栏目:安全 来源:网络整理
导读:This question讨论了如何以交替方式交织两个列表,即插入它们. 被称为“插入”的反转是什么? 在Scala中实现这个是否有惯用的方法? 解决方法 该主题在此 Haskell IRC session中进行了讨论. 可能性包括“deintercalate”,“extracalate”,“ubercalate”,“ou
This question讨论了如何以交替方式交织两个列表,即插入它们.

>被称为“插入”的反转是什么?
>在Scala中实现这个是否有惯用的方法?

解决方法

该主题在此 Haskell IRC session中进行了讨论.

可能性包括“deintercalate”,“extracalate”,“ubercalate”,“outercalate”和“chocolate”;-)

假设我们选择“extracalate”,它可以实现为折叠:

def extracalate[A](a: List[A]) = 
    a.foldRight((List[A](),List[A]())){ case (b,(a1,a2)) => (b :: a2,a1) }

例如:

val mary = List("Mary","had","a","little","lamb")
extracalate(mary)                              
//>  (List(Mary,a,lamb),List(had,little)

请注意,只有在以下情况之一的情况下才能重建原始列表:

>输入列表的长度相同,或
>第一个列表比第二个列表长1

第二种情况实际上证明对geohashing算法有用,其中纬度位和经度位被插入,但可能存在奇数位.

另请注意,链接问题中插入的定义与Haskell libraries中的定义不同,后者在列表列表之间插入了一个列表!

更新:对于任何折叠,我们提供一个起始值和一个函数,以应用于输入列表的每个值.此功能修改起始值并将其传递到折叠的下一步.
在这里,我们从一对空输出列表开始:( List [A](),List [A]())
然后,对于输入列表中的每个元素,我们使用cons ::将它添加到其中一个输出列表的前面.但是,每次调用函数时,我们也会交换两个输出列表的顺序; (a1,a2)变为(b :: a2,a1).这以交替的方式在两个输出列表之间划分输入列表.因为它是一个正确的折叠,我们从输入列表的末尾开始,这是以正确的顺序获取每个输出列表所必需的.从起始值到最终值,我们将获得:

([],[])
([lamb],[])
([little],[lamb])
([a,lamb],[little])
([had,little],[a,lamb])
([Mary,[had,little])

(编辑:李大同)

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

    推荐文章
      热点阅读