如何获取List的第一个元素,它本身就是Map [int,Any]类型的Map的成员

时间:2016-02-19 10:16:10

标签: list scala dictionary casting

示例:

Comperator

变量a的类型为DROP TABLE IF EXISTS t; CREATE TABLE t(id INT); INSERT INTO t VALUES(1),(2),(3),(4),(6),(7),(8); SELECT a.id start , MIN(c.id) end FROM t a LEFT JOIN t b ON b.id = a.id - 1 LEFT JOIN t c ON c.id >= a.id LEFT JOIN t d ON d.id = c.id + 1 WHERE b.id IS NULL AND c.id IS NOT NULL AND d.id IS NULL GROUP BY a.id; +-------+------+ | start | end | +-------+------+ | 1 | 4 | | 6 | 8 | +-------+------+

我想获得var a = Map(1 -> List(7,8,9), 2 -> 15) 的第一个元素。 scala.collection.immutable.Map[Int,Any]给了我一个错误:List(7, 8, 9)

如何将a(1)(0)转换为Any does not take parameters

请帮忙。

2 个答案:

答案 0 :(得分:3)

类似于@EndeNeu,但仍然涵盖了空列表的情况,为了很好地定义问题我们假设值为0

a.collect {
  case (i, Nil)   => (i, 0)
  case (i, x::_) => (i, x)
  case p @ (_, _) => p
}

注意@将元组绑定到p,以便在部分映射中我们不需要复制整个元组。

答案 1 :(得分:2)

使用collect应该有效:

scala> var a = Map(1 -> List(7,8,9), 2 -> 15)
a: scala.collection.immutable.Map[Int,Any] = Map(1 -> List(7, 8, 9), 2 -> 15)

scala>   
   |   a collect {
   |     case (i: Int, l: List[_]) if l.nonEmpty => (i, l.head)
   |     case  (i: Int, j: Int) => (i, j)
   |   }
res1: scala.collection.immutable.Map[Int,Any] = Map(1 -> 7, 2 -> 15)

但是我警告你不要收到一个Any的收藏品,你丢失了所有类型的安全性而且收集无法获取你想要的东西,因为匹配并不详尽,我会审查我的方法如果我是你,可能会根据你的应用逻辑使用两个集合。