Arrays 使用scala.collection.search时的排序
我有一个[Long,Q]数组,希望对其进行二进制搜索。我尝试了以下方法: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 但是有这个错误 没有为任何
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