我正在尝试使用Option [Any]定义数据类型的排序,但是得到的错误为"方法比较会覆盖任何内容"
下面是代码: -
implicit def ordering[Option[A]]: Ordering[Option[A]] = new Ordering[Option[A]] {
override def compare[A](x: A, y: A)(implicit ord: Ordering[A]): Int = {
ord.compare(x,y)
}
}
这整个代码使用可变列表和任意类型的
来构建二叉搜索树import scala.collection.mutable.ListBuffer
import math.Ordering
import Numeric.Implicits._
class treeUsingList[A]( treeList:ListBuffer[Option[Any]] ){
println("A greeter is being instantiated")
var lst = treeList
var size= treeList.length
lst=buildtree(lst)
implicit def ordering[Option[A]]: Ordering[Option[A]] = new Ordering[Option[A]] {
override def compare[A](x: A, y: A)(implicit ord: Ordering[A]): Int = {
ord.compare(x,y)
}
}
def buildtree[A](inputLst:ListBuffer[Option[A]]): ListBuffer[Option[Any]]={
var j=0
var k=0
var lst = ListBuffer[Option[Any]]()
for (i<- inputLst){
lst = this.addNode(lst, i , 0)
}
lst
}
def addNode[A](treeLst:ListBuffer[Option[A]] , item :A , idx:Int)(implicit order: Ordering[Option[A]]):ListBuffer[Option[A]] ={
if (order.lt(treeLst(idx) , Some(item)) ){
if(treeLst.length < idx*2+1){
while(treeLst.length < idx*2+1){
treeLst.append(None)
}
treeLst.append(Some(item))
}
else{
if(treeLst(idx*2+2)==None){
treeLst(idx*2+2)= Some(item)
}
else{
addNode(treeLst,item ,idx*2+2 )
}
}
}
treeLst
}
}
object mainTree{
var b = scala.collection.mutable.ListBuffer[Option[Any]](Some(5),Some(2),Some(3),Some(1),Some(7))
var atree = new treeUsingList[Int](b)
print(atree)
}
答案 0 :(得分:1)
确定你想要实现的目标有点困难,因为代码正在做许多令人困惑或完全错误的事情。
class
此类型参数会隐藏A
定义中定义的参数,这意味着compare()
方法中的A
与其外的override def compare[A](x: A, y: A)(implicit ord: Ordering[A]): Int = . . .
^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^
不同。
trait
您尝试覆盖的def ordering[Option[A]]: . . .
^^^^^^^^^
成员没有第二个参数组,因此不匹配。
Option[A]
在这里,您要创建一个名为“class treeUsingList[A](treeList:ListBuffer[Option[Any]]) {
. . .
implicit def ordering: Ordering[Option[A]] = new Ordering[Option[A]] {
override def compare(x: Option[A], y: Option[A]): Int = {
implicitly[Ordering[Option[A]]].compare(x, y)
//probably better to unpack x and y before comparing
}
}
. . .
}
”的类型参数,这是一个类型参数的愚蠢名称,并不代表您的想法。
所以这里是编译的东西。可能不是你想要的,但它编译,这不是一个糟糕的起点。
warnings
答案 1 :(得分:1)
我认为不需要定义订购对象。您可以使用math.Ordering.OptionOrdering
。
可以使用OptionOrdering[Int]
math.Ordering.Option[Int]
的实例
以下代码可以编译,但仍然有一些bug。
import scala.collection.mutable.ListBuffer
import math.Ordering._
import Numeric.Implicits._
class treeUsingList[A]( treeList:ListBuffer[Option[A]])(implicit order: Ordering[Option[A]]){
println("A greeter is being instantiated")
var lst = treeList
var size= treeList.length
lst=buildtree(lst)
def buildtree(inputLst:ListBuffer[Option[A]]): ListBuffer[Option[A]]={
var j=0
var k=0
var lst = ListBuffer[Option[A]]()
for (i<- inputLst){
lst = addNode(lst, i , 0)
}
lst
}
def addNode(treeLst:ListBuffer[Option[A]] , item :Option[A] , idx:Int)(implicit order: Ordering[Option[A]]):ListBuffer[Option[A]] ={
if (order.lt(treeLst(idx) , item) ){
if(treeLst.length < idx*2+1){
while(treeLst.length < idx*2+1){
treeLst.append(None)
}
treeLst.append(item)
}
else{
if(treeLst(idx*2+2)==None){
treeLst.update(idx*2+2, item)
}
else{
addNode(treeLst,item ,idx*2+2 )(order)
}
}
}
treeLst
}
}
object mainTree{
var b = scala.collection.mutable.ListBuffer[Option[Int]](Some(5),Some(2),Some(3),Some(1),Some(7))
var atree = new treeUsingList[Int](b)(math.Ordering.Option[Int])
print(atree)
}