2014-11-19 2 views

ответ

0

Найдено этот подход, основанный на итераторе над ключами, который позволяет избежать индексаций промежуточных коллекций следующим образом,

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) 
0

Вы можете использовать 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 
+0

Если производительность здесь является фактором, то использование 'data.view.zipWithIndex.collectFirst' поможет вам пропустить создание промежуточной коллекции. –

Смежные вопросы