【问题标题】:What would be an appropriate collection type for storing few elements?存储少量元素的合适集合类型是什么?
【发布时间】:2012-11-16 00:49:46
【问题描述】:

在 Scala 支持的不同集合类型(列表、映射、哈希映射、集合等)中,什么是合适的集合类型来实现可以通过下面的 C 代码完成的事情

typedef enum { GOOD BAD MAX_QUALITY } quality

struct student_data s_data[MAX_QUALITY];

集合很小...... 2 或 3 个元素,但在对数据执行类似操作时,拥有一个集合有助于保持代码优雅。

谢谢!

【问题讨论】:

  • 有关选择正确集合的更多信息,我推荐 Josh Seureth 的书 Scala in Depth,其中有一章标题为“使用正确的集合”,其中涉及各种用例和每种集合类型的权衡.

标签: scala collections enums


【解决方案1】:

ListSeq 不同的 case classes 应该可以解决问题。当我说不同的案例类别时,我的真正意思是:

case class CaseClass1(arg1: String, arg2: Int, arg3: OtherCaseClass)
case class OtherCaseClass(arg1: String, arg2: String)

val foo: List[CaseClass1] = ...

然后CaseClass1 的实例被组合并存储在您的列表中。

【讨论】:

【解决方案2】:

如果您的目标是创建一个提供快速索引查找的类似枚举的数据结构,我会选择:

sealed trait Quality { val index: Int }
case class BAD() extends Quality { val index = 0 } 
case class GOOD() extends Quality { val index = 1 } 
case class MAX_QUALITY() extends Quality { val index = 2 } 

这允许在任意quality: Quality 上使用模式匹配,并且详细的语法quality.index 明确表明此时质量用作Int 索引。

【讨论】:

    【解决方案3】:

    您能详细说明一下吗? 如果您的意图是创建与 quality 类型的数据相关联的结构,student_data 类型的数据结构,那么您可以使用 Map

    取决于您是否需要可变访问,或者您只是创建结构然后访问是只读的,您将使用可变或不可变映射。

    在您的情况下,我建议使用不可变地图。 Scala 集合库为小型映射提供了专门的版本,最多可插入 5 个键值对,与非专业类型的映射相比,它们提供了更好的性能和内存占用。

    val x = Map(1 -> 2, 2 -> 3)
    println(x.getClass)
    >> class scala.collection.immutable.Map$Map2
    

    您还可以定义别名,以便更轻松地使用您的结构

    type StudentStruct = Map[Quality, StudentData]
    

    用法:

    val studentStruct = Map(Bad -> studentData)
    val studentStruct2 = studentStruct + (Good -> studentData2)
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2012-11-30
      • 2020-10-27
      • 2017-07-02
      • 1970-01-01
      • 2011-07-21
      • 2019-04-28
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      相关资源
      最近更新 更多