通用Option [Any]类型的scala隐式排序

时间:2018-03-08 05:38:38

标签: scala lambda functional-programming

我正在尝试使用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)
}

2 个答案:

答案 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)
}