Scala replace for Arrays.binarySearch?

2022-09-01 11:26:57

在Scala中是否有Java的替代品?int Arrays.binarySearch(Object[] array, object)

问题是 Scala 的数组不是协变的,所以我必须先像这样转换:stringArray: Array[String]

stringArray.asInstanceOf[Array[Object]]

有没有更好的解决方案?


答案 1

Scala 2.11 将 scala.collection.Searching 添加到标准库中。它对索引序列使用二进制搜索,否则使用线性搜索。

import scala.collection.Searching._
Array(1, 2, 3, 4, 5).search(3)

答案 2

据我所知,没有任何内置功能,但是您可以使用pimp-my-library模式来相当容易地完成此操作。这样:

class ObjectArrayTools[T <: AnyRef](a: Array[T]) {                  
   def binarySearch(key: T) = {
     java.util.Arrays.binarySearch(a.asInstanceOf[Array[AnyRef]],key)
   }
}
implicit def anyrefarray_tools[T <: AnyRef](a: Array[T]) = new ObjectArrayTools(a)

scala> Array("a","fish","is","some","thing").binarySearch("some")
res26: Int = 3
scala> Array("a","fish","is","some","thing").binarySearch("bye")  
res28: Int = -2

如果还需要其他对象方法,也可以将它们添加到同一类中。java.util.Arrays

总的来说,我发现习惯于总是导入你最喜欢的Scala实用程序的集合是个好主意。添加这样的功能非常容易,您最好在一般情况下执行此操作,而不是继续键入 ,并且只需一点努力,您就可以使自己的工作效率大大提高。.asInstanceOf[Array[AnyRef]]