我試圖創建一個其中包含PriorityQueue
的數據結構。我成功地製作了它的非通用版本。我可以告訴它,因爲它解決了A.I.我有問題。
這裏是它的一個片段:使用Implicit排序問題使用PriorityQueue(斯卡拉)
class ProntoPriorityQueue { //TODO make generic
implicit def orderedNode(node: Node): Ordered[Node] = new Ordered[Node] {
def compare(other: Node) = node.compare(other)
}
val hashSet = new HashSet[Node]
val priorityQueue = new PriorityQueue[Node]()
...
我試圖使它通用,但如果我用這個版本,它停止解決問題:
class PQ[T <% Ordered[T]] {
//[T]()(implicit val ord: T => Ordered[T]) {
//[T]()(implicit val ord: Ordering[T] {
val hashSet = new HashSet[T]
val priorityQueue = new PriorityQueue[T]
...
我也試過什麼評論而不是使用[T <% Ordered[T]]
這裏走出來的是調用PQ
代碼:
//the following def is commented out while using ProntoPriorityQueue
implicit def orderedNode(node: Node): Ordered[Node] = new Ordered[Node] {
def compare(other: Node) = node.compare(other)
} //I've also tried making this return an Ordering[Node]
val frontier = new PQ[Node] //new ProntoPriorityQueue
//have also tried (not together):
val frontier = new PQ[Node]()(orderedNode)
我也嘗試將隱式def移動到Node
對象(並導入它),但基本上是同樣的問題。
我在做什麼錯誤的通用版本?我應該在哪裏隱含?
解決方案 這個問題是不是與我的隱含定義。問題在於隱含的排序被Set
拾取,該排列在for(...) yield(...)
語句中自動生成。這在導致集合只包含一個狀態的情況下引起了一個問題。
我試過在我的Node上擴展'Ordering [Node]'。我已經實現了一個'比較(其他:節點)'和'比較(一些:節點,其他:節點)' 這導致了一堆問題在其他方法調用涉及'節點' 這裏有一些它們: - 發散隱擴張型 \t scala.collection.generic.CanBuildFrom [main.Moves.ValueSet,選項[main.Node],即]在對象方法 \t newCanBuildFrom開始的SortedSet \t - 不夠論據方法映射:(隱含bf: \t scala.collection.generic.CanBuildFrom [main.Moves.ValueSet,Option [main.Node],That])那。未指定的值 \t參數bf – Tombstone 2013-02-13 20:38:31
@墓碑:您不需要讓'Node'類擴展'Ordering [Node]',您可以定義一個擴展了'Ordering [Node]'的類來定義'Node'上的排序關係定義「compare」方法。 – 2013-02-13 21:49:28
我做了一個擴展Ordering [Node]的新類,它可以工作。謝謝。我仍然有關於暗示的問題。我以前的暗示如何不起作用? '隱DEF nodeOrderer:訂貨[節點] =新訂貨[節點] { \t DEF比較(一些:節點,其它:節點)= some.compare(其他) }'' 隱VAL ordN:訂貨[節點] =新訂購[節點] { \t def比較(一些:節點,其他:節點)= some.compare(其他) } – Tombstone 2013-02-14 01:46:51