Самое простое - использовать стандартную черту Scala Ordered[T]
и сопровождающие ее неявные экземпляры.
Используя ограничение вида <% Ordered[T]
, Scala будет искать неявный экземпляр Ordered[T]
в области действия и позволит вам использовать любой из его методов (например, <
, >
, >=
, <=
, compare
) для универсального типа.
Вот слегка переписанная функция двоичного поиска,
def binarySearch[T <% Ordered[T]](x: T, xs: Seq[T]): Int = {
def searchBetween(start: Int, end: Int): Int = {
if (start > end) return -1 // not found
val pos = (start + end ) / 2
if (xs(pos) == x) pos // found, return position
else if (xs(pos) < x) searchBetween(pos+1, end)
else searchBetween(start, pos-1)
}
searchBetween(0, xs.length)
}
Затем вы можете сразу использовать его со многими распространенными классами, такими как Byte
, Short
, Int
, Long
, String
, BigInt
, ... в основном, с любым типом, для которого определяется Scala экземпляр Ordering[T]
или даже предоставьте свой собственный, внедрив Ordering[YourType]
и либо передав его явно binarySearch()
, либо предоставив неявный экземпляр в области действия.
Вот примеры с Int
и String
:
scala> binarySearch(2, Seq(1,2,3,4,5))
res1: Int = 1
scala> binarySearch("d", Seq("a","b","d","f"))
res2: Int = 2