【发布时间】:2023-04-02 22:34:01
【问题描述】:
我有一个SortedMap 的类型:
data: SortedMap[Long, SortedMap[String, Double]]
如何找到特定键的索引。
例如:
data = (1L -> ("a" -> 1.), 2L -> ("b" -> 1., "c" -> 2.), 3L -> ("b" -> 1.))
我想找到键2L的索引(结果应该是1)。
【问题讨论】:
我有一个SortedMap 的类型:
data: SortedMap[Long, SortedMap[String, Double]]
如何找到特定键的索引。
例如:
data = (1L -> ("a" -> 1.), 2L -> ("b" -> 1., "c" -> 2.), 3L -> ("b" -> 1.))
我想找到键2L的索引(结果应该是1)。
【问题讨论】:
发现这种方法基于键的迭代器,避免索引中间集合,如下所示,
data.keysIterator.indexWhere(_ == 2)
为了便于使用考虑这个隐含的,
implicit class RichSortedMap[A,B](val m: SortedMap) extends AnyVal {
def keyIndexWhere(k: A) = m.keysIterator.indexWhere( _ == k )
}
所以你可以按如下方式使用它,
data.keyIndexWhere(2)
【讨论】:
您可以使用zipWithIndex 将每个键值与其索引配对,然后使用collectFirst 找到具有正确键的配对并提取索引。这将返回Option[Int](如果找不到密钥,则返回None)。
val data: SortedMap[Long, SortedMap[String, Double]] = SortedMap(
1L -> SortedMap("a" -> 1.0),
2L -> SortedMap("b" -> 1.0, "c" -> 2.0),
3L -> SortedMap("b" -> 1.0)
)
def findIndex(data: SortedMap[Long, SortedMap[String, Double]], key: Long): Option[Int] =
data.zipWithIndex.collectFirst { case ((`key` , _), i) => i }
scala> findIndex(data, 1L)
res16: Option[Int] = Some(0)
scala> findIndex(data, 2L)
res17: Option[Int] = Some(1)
scala> findIndex(data, 10L)
res18: Option[Int] = None
【讨论】:
data.view.zipWithIndex.collectFirst 将帮助您跳过中间集合创建。