在scala

时间:2015-12-02 15:20:05

标签: scala dictionary

我希望返回一个包含不同数据类型值的映射,例如 (key - > String)和(key - > Int),但我可以使用Map Map [String,String]或Map [String,Int]。 我不能使用类,因为键的数量和顺序不固定。 有没有办法将String和Int包装到泛型类中,以便我可以将map返回为Map [String,Any]

2 个答案:

答案 0 :(得分:1)

您可以使用HMap作为@Harnish建议,但scala库中有另一种选择:Map[String, Either[Int, String]]。只有当您知道某种类型或其他类型而且仅此类型时,它才适用。

可以Either[Int, String]Left(5)创建Right("Hello")类型。然后你可以使用匹配来测试值:

x match {
  case Left(n) => println(s"$n is a number")
  case Right(s) => println(s"$s is a string")
}

<强>更新 例如:

val dict = scala.collection.mutable.Map[String, Either[String, Int]]()
dict += ("a" -> Right(5))
dict += ("b" -> Left("Hello"))

dict map {
  case (key, Right(n)) => println(s"For $key: $n is integer")
  case (key, Left(s)) => println(s"For $key: $s is string")
}

答案 1 :(得分:0)

我不确定您是否可以使用标准集合库执行此操作,但可以使用shapeless HMap(异构映射)。这是文档中给出的示例,它与您所描述的内容非常匹配:

// Key/value relation to be enforced: Strings map to Ints and vice versa
class BiMapIS[K, V]
implicit val intToString = new BiMapIS[Int, String]
implicit val stringToInt = new BiMapIS[String, Int]

val hm = HMap[BiMapIS](23 -> "foo", "bar" -> 13)
//val hm2 = HMap[BiMapIS](23 -> "foo", 23 -> 13)   // Does not compile

scala> hm.get(23)
res0: Option[String] = Some(foo)

scala> hm.get("bar")
res1: Option[Int] = Some(13)

注意,它不会给你一个Any,而是你必须在你的键/值对中指定有效的东西。我不确定这对你是否有帮助......