代码之家  ›  专栏  ›  技术社区  ›  ziggystar

我应该使用List[A]或Seq[A]还是其他什么?

  •  15
  • ziggystar  · 技术社区  · 14 年前

    那么,我应该为哪种通用的堆栈式数据结构编写方法和算法呢?我能坚持什么样的模式吗?所有这些都是因为这些方法可能需要在未来得到优化,以防它们形成瓶颈。

    更新

    我会尽量精确一点: 这些行动的效率如何?

    例如,我应该使用TraversableOnce或IndexedSeq而不是List或Array吗?它能给我买点什么吗?

    附加问题

    是什么 数据结构签名之类的默认列表?你写作吗

    def a(b: List[A]): List[A] 
    

    def a(b: TraversableOnce[A]): TraversableOnce[A]
    

    你能解释一下为什么吗?

    3 回复  |  直到 11 年前
        1
  •  12
  •   gerferra    14 年前

    Seq 为您的参数和设计您的方法来有效地工作 List . 这样,您的方法将适用于大多数 在使用方法之前,您不必转换seq。

    编辑

    1. 那么,我应该为哪种通用的堆栈式数据结构编写方法和算法呢?
      • 我想答案是 . 它是一堆而且非常快
      • IndexedSeq scaladoc说“索引序列支持常数时间或接近常数时间的元素访问和长度计算”。如果你有 有人通过 索引EQ
    2. 数据结构签名的默认列表是什么?
        2
  •  30
  •   missingfaktor Kevin Wright    14 年前

    List 是的默认实现 LinearSeq ,这又是 Seq ,这又是 Iterable ,这又是 Traversable

    here 并根据您的要求选择最通用的型号。


    alt text


    This

        3
  •  5
  •   Community CDub    8 年前

    有关收藏库的背景信息,请查看 Scala 2.8 Collections API 文章。

    如果你有具体的操作,那就特别注意 Performance Characteristics section .

    关于是否使用特定类型或更一般的特性的设计选择,我认为这取决于您在实现中所做的工作。例如,如果一个方法接受一个列表,那么它可以依赖于fast prepend,并可以在其实现中使用它。因此,接受一个更一般的特质可能会产生不想要的绩效结果。另外,你还得担心你会得到什么样的回报。

    scala> def a[A](t:TraversableOnce[A]): TraversableOnce[A] = t
    a: [A](t: TraversableOnce[A])TraversableOnce[A]
    
    scala> a(List(1,2))
    res0: TraversableOnce[Int] = List(1, 2)
    
    scala> res0.tail
    <console>:8: error: value tail is not a member of TraversableOnce[Int]
           res0.tail
    

    如果你想写一些通用的东西,你可能需要保留类型。看到了吗 Can I "pimp my library" with an analogue of TraversableLike.map that has nicely variant types? 了解一下您将遇到的问题和一些解决方案。