我如何在Scala中表示复合键?

时间:2011-10-28 05:36:21

标签: scala

如果我有

val key1 = "mykey"
val key2 = 427

两者都可以哈希吗?我可以做类似

的事情
val compoundKey = key1 + "#" + key2
myhash.put(compoundKey, value)

然而,这似乎有点笨重

2 个答案:

答案 0 :(得分:12)

使用Tuple

val compoundKey = (key1, key2)

答案 1 :(得分:9)

我总是喜欢Tuple上的新数据类型有三个原因:

case class CompoundKey(key1: String, key2: String)
  1. 您有一个名字,特别是在编译器警告中,“expected CompoundKey”比“expected Tuple2[String,String]”更清晰。或者它只是帮助您使用类型注释来使您自己的代码更具可读性,尤其是在像地图

    这样的嵌套结构中

    val k: CompoundKey = expensiveComputationOrNonObviousMethodCallsInARow(...)
    val keyMap: Map[CompoundKey,Key]代替Map[(String,String),Key]

  2. 可以通过名称访问CompoundKey中的子键:

    val ckey = CompoundKey("foo","bar")
    ckey.key1代替ckey._1

  3. 它允许您稍后更改嵌套类型的表示形式,此处为String。这意味着,如果您将String更改为您不必在代码中更改Tuple2[String,String]的任何内容。只有CompoundKey必须进行调整。
  4. (我甚至会使用包装器case class Key(str: String)作为密钥类)