Find the last element in an indexed sequence matching a predicate

What is the right way to find Scala last element in an indexed sequence (for example Vector, Arrayor ArrayBuffer) corresponding to the predicate, if we want to make the decision quickly when the element exists near the end of the sequence?

You can use this to achieve this seq.reverse.find, but this is O (N), since the inverse makes a complete copy of the sequence.

+5
source share
3 answers

.lastIndexWhere, IndexedSeqOptimized, , , .apply(i), .

.lastIndexWhere IndexedSeqOptimized , p(i) .

, , , .
, O(n). , , , , .


.lastIndexWhere:

scala> val a = (1 to 100).toArray
a: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100)

scala> def p(i: Int) = {println(s"Checking for $i!"); i == 97}
p: (i: Int)Boolean

scala> a(a.lastIndexWhere(p))
Checking for 100!
Checking for 99!
Checking for 98!
Checking for 97!
res0: Int = 97
+2

Vector.reverseIterator - O (1).

+2

Starting with Scala 2.13you can use Boolean): Option [A] rel = "nofollow noreferrer">findLast , which is the opposite findand uses the predicate to match from the end of the collection:

Array((10, 'a'), (20, 'b'), (30, 'c'), (20, 'd')).findLast(_._1 == 20)
// Option[(Int, Char)] = Some(20, 'd')
+1
source

Source: https://habr.com/ru/post/1683811/


All Articles