Arrays 使用scala.collection.search时的排序

Arrays 使用scala.collection.search时的排序,arrays,scala,search,Arrays,Scala,Search,我有一个[Long,Q]数组,希望对其进行二进制搜索。我尝试了以下方法: import scala.collection.Searching._ class Q (val b:Double, val a:Double) val myArray = Array(5L -> new Q(1,2), 6L-> new Q(6,9), 7L-> new Q(7,6)) val i = myArray.search(6L).insertionPoint 但是有这个错误 没有为任何

我有一个[Long,Q]数组,希望对其进行二进制搜索。我尝试了以下方法:

import scala.collection.Searching._
class Q (val b:Double, val a:Double)

val myArray = Array(5L -> new Q(1,2), 6L-> new Q(6,9), 7L-> new Q(7,6))
val i = myArray.search(6L).insertionPoint  
但是有这个错误
没有为任何
未指定值参数ord。
我知道我需要为此集合数组[(Long,Q)]指定一个排序规则,但我自己无法解决这个问题。

请帮助签名
search
search[B>:A](elem:B)(隐式order:Ordering[B])
。您有一个类型为
[Long,Q]
的数组。因此,为了让编译器正确推断
顺序
,您必须像这样调用搜索:

myArray.search(6L-> q/*Q(6,9)*/)(Ordering.by(_._1)) //ordering by the first value in a tuple.
您所做的是:
myArray.search(6L)
。如果我正确理解了您要做的事情,那么很可能需要在数组中找到值和位置。 您可以使用两种不同的数据结构来解决此问题:

  • 密钥可以存储在数组中,如下所示:

    val myArray = Array(5L, 6L, 7L).toList 
    myArray.search(6L).insertionPoint  
    
  • 如果您需要值,您可以使用map,它可以用作字典:

    val dictionary = Map(
       5L -> new Q(1,2),
       6L-> new Q(6,9),
       7L-> new Q(7,6)
    )
    
编辑:

事实上,我注意到这样做会奏效:

val dummy = new Q(0,0) //any instance of Q
myArray.search(6L-> dummy)(Ordering.by(_._1)).insertionPoint //1

因为使用了查找插入点的
排序
,并且没有执行相等性测试。

搜索的签名是
搜索[B>:A](元素:B)(隐式ord:排序[B])
。您有一个类型为
[Long,Q]
的数组。因此,为了让编译器正确推断
顺序
,您必须像这样调用搜索:

myArray.search(6L-> q/*Q(6,9)*/)(Ordering.by(_._1)) //ordering by the first value in a tuple.
您所做的是:
myArray.search(6L)
。如果我正确理解了您要做的事情,那么很可能需要在数组中找到值和位置。 您可以使用两种不同的数据结构来解决此问题:

  • 密钥可以存储在数组中,如下所示:

    val myArray = Array(5L, 6L, 7L).toList 
    myArray.search(6L).insertionPoint  
    
  • 如果您需要值,您可以使用map,它可以用作字典:

    val dictionary = Map(
       5L -> new Q(1,2),
       6L-> new Q(6,9),
       7L-> new Q(7,6)
    )
    
编辑:

事实上,我注意到这样做会奏效:

val dummy = new Q(0,0) //any instance of Q
myArray.search(6L-> dummy)(Ordering.by(_._1)).insertionPoint //1

它可以工作,因为在查找插入点时,使用了
排序
,并且没有执行相等性测试。

Map不起作用,因为在不存在元素的情况下,我希望使用seach给出的最接近的索引。关于你的提议,我不清楚你为什么在搜索时在myArray中创建新元素?此外,是否可以隐式定义一次排序,这样就不必每次调用seach时都传递它?您不必在搜索中创建新的
Q
,但必须提供一个,它将等于数组中的一个。如果你没有值,你只会从地图上收到
None
。但是为什么你需要创建一个伪Q。必须有一个更干净的方法,因为搜索需要
[Long,Q]
。为什么你甚至需要阵列?映射不起作用?我使用数组是因为我需要进行二进制搜索。如果我寻找一个不存在的元素,我应该在需要推送它时得到索引。地图在这种情况下不起作用。你有其他的意见吗?Map不起作用,因为在不存在元素的情况下,我希望有最接近的索引,这是由seach给出的。关于你的提议,我不清楚你为什么在搜索时在myArray中创建新元素?此外,是否可以隐式定义一次排序,这样就不必每次调用seach时都传递它?您不必在搜索中创建新的
Q
,但必须提供一个,它将等于数组中的一个。如果你没有值,你只会从地图上收到
None
。但是为什么你需要创建一个伪Q。必须有一个更干净的方法,因为搜索需要
[Long,Q]
。为什么你甚至需要阵列?映射不起作用?我使用数组是因为我需要进行二进制搜索。如果我寻找一个不存在的元素,我应该在需要推送它时得到索引。地图在这种情况下不起作用。你有其他的意见吗?你不应该在Scala中需要或使用
null
,但这里有一个例子它可能会派上用场:
myArray.search(6L->null)(Ordering.by(u.\u 1)).insertionPoint
你不应该在Scala中需要或使用
null
,但这里有一个例子它可能派上用场:
myArray.search(6L->null)(Ordering.by(u._1)).insertionPoint