【问题标题】:Finding the index of a specific SortedMap查找特定 SortedMap 的索引
【发布时间】: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)。

【问题讨论】:

    标签: scala sortedmap


    【解决方案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)
    

    【讨论】:

      【解决方案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 将帮助您跳过中间集合创建。
      猜你喜欢
      • 2011-07-04
      • 2018-04-24
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 2017-04-19
      • 1970-01-01
      • 1970-01-01
      • 2020-01-25
      相关资源
      最近更新 更多