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

Hoa*_*Hoa 7 scala

如果我有

val key1 = "mykey"
val key2 = 427
Run Code Online (Sandbox Code Playgroud)

两者都可以哈希吗?我可以做点什么

val compoundKey = key1 + "#" + key2
myhash.put(compoundKey, value)
Run Code Online (Sandbox Code Playgroud)

然而,这似乎有点笨拙

Jea*_*let 12

使用Tuple:

val compoundKey = (key1, key2)
Run Code Online (Sandbox Code Playgroud)


Pet*_*itz 9

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

case class CompoundKey(key1: String, key2: String)
Run Code Online (Sandbox Code Playgroud)
  1. 你有一个名字,特别是在编译器警告中," expected CompoundKey"比" expected Tuple2[String,String]" 更清晰.或者它只是帮助您使用类型注释来使您自己的代码更具可读性,尤其是在像Maps这样的嵌套结构中

    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需要进行调整.

(我甚至会使用case class Key(str: String)密钥类的包装器)