Scala替换Arrays.binarySearch?

soc*_*soc 27 java search programming-languages scala

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

问题是Scala的Arrays不是协变的,所以我必须stringArray: Array[String]先把我这样的:

stringArray.asInstanceOf[Array[Object]]
Run Code Online (Sandbox Code Playgroud)

有更好的解决方案吗?

Joe*_*las 43

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

import scala.collection.Searching._
Array(1, 2, 3, 4, 5).search(3)
Run Code Online (Sandbox Code Playgroud)

  • 我如何告诉搜索方法我的数组已排序并且可以使用二分搜索? (2认同)

Rex*_*err 19

据我所知,没有内置任何东西,但你可以使用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
Run Code Online (Sandbox Code Playgroud)

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

一般来说,我觉得习惯于总是导入你最喜欢的Scala实用程序的集合是个好主意.添加这样的功能非常容易,你可以这样做,而不是继续打字.asInstanceOf[Array[AnyRef]],只需稍加努力就可以让自己显着提高工作效率.

  • 如果`binarySearch`依赖于`Comparable`这个项,我们不应该添加一个约束,比如`T <:Comparable [T]`? (3认同)