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

扩展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

这可以说是最“正确”的解决方案,尽管它也会带来最高的性能成本.

(编辑:李大同)

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

    推荐文章
      热点阅读