扩展Scala集合:一种基于Array的索引练习
发布时间:2020-12-16 19:09:30 所属栏目:安全 来源:网络整理
导读:作为练习,我想将 Scala数组集合扩展到我自己的OneBasedArray(做你期望的,索引从1开始).由于这是一个不可变的集合,我想让它在调用filter / map等时返回正确的类型. 我已经阅读了资源here,here和here,但我很难理解如何将其转换为数组(或者除了示例中的集合之外
作为练习,我想将
Scala数组集合扩展到我自己的OneBasedArray(做你期望的,索引从1开始).由于这是一个不可变的集合,我想让它在调用filter / map等时返回正确的类型.
我已经阅读了资源here,here和here,但我很难理解如何将其转换为数组(或者除了示例中的集合之外的其他集合).我是否在这种结构的正确轨道上? class OneBasedArray[T] extends Array[T] with GenericTraversableTemplate[T,OneBasedArray] with ArrayLike[T,OneBasedArray] 是否还有其他资源可以帮助解释扩展集合? 解决方法
Array不是典型的Scala集合……它只是一个Java数组,它通过隐式转换被看成是一个集合.
鉴于Java Arrays的混乱变化,你真的不想在没有极其令人信服的理由的情况下使用它们,因为它们是潜伏的bug的来源. (见这里:http://www.infoq.com/presentations/Java-Puzzlers) 像这样捣乱一个基于1的集合也不是一个好主意,因为你无法知道有多少其他集合方法依赖于序列从0开始的假设.所以要安全地做(如果你真的必须),你需要添加一个新的方法,保持默认值不变: class OneBasedLookup[T](seq:Seq) { def atIdx(i:Int) = seq(i-1) } implicit def seqHasOneBasedLookup(seq:Seq) = new OneBasedLookup(seq) // now use `atIdx` on any sequence. 即使更安全,您也可以创建一个Map [Int,T],索引是一个基础 (Iterator.from(1) zip seq).toMap 这可以说是最“正确”的解决方案,尽管它也会带来最高的性能成本. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |