我在Scala中制作基本的图表。
abstract class Vertex
class Edge (
val source: Vertex
val dest: Vertex
)
class Graph[V <: Vertex] {
...
}
在某些时候,我需要能够在Graph[Vertex]
中对顶点列表进行排序。我想通过致电vertices.sorted
来做到这一点。如果我使Vertex扩展Ordered[Vertex]
,那么我实际上没有正确的compareTo
,因为排序信息将是Vertex
和compareTo
实现的子类中的数据任何Vertex
。但是,如果我将Vertex
实施MyVertex
扩展为Ordered[MyVertex]
,则Graph[MyVertex]
中无法提供该信息。
这个问题的最佳解决方案是什么?我应该使用隐式排序吗?有没有办法强制Vertex
的子类对自己有隐式排序?
我宁愿不做以下事情:
class MyClass extends Vertex {
override def compare(that: Vertex) = that match {
case that: MyClass => // do the comparison
case _ => false
}
}
更新:也许Graph
的构造函数需要Ordering[V]
?
更新:我总是可以限制V <: Ordered[V]
,但这不会扩展。是否可能有多种类型限制?
答案 0 :(得分:1)
更新:也许
Graph
的构造函数需要Ordering[V]
?
这将是我首选的方法,因为这样您可以根据需要传递不同的Ordering
。
更新:我总是可以限制
V <: Ordered[V]
,但这不会扩展。是否可能有多种类型限制?
是的,因为Scala有交集类型:V <: Ordered[V] with Something[V] with SomethingElse[V]
。
答案 1 :(得分:1)
为什么不呢?
class Graph[V <: Vertex with Ordered[V]]
或者你也可以采用Ordering
的方式:
class Graph[V <: Vertex : Ordering]
答案 2 :(得分:0)
为什么不将Graph
类设计为包含List
个Vertex
个对象?然后,您可以使用List的方便的内置sortWith
方法。
例如:
class Graph(val Vertices:List[Vertex]) {
def sorted():Graph = {
new Graph(Vertices.sortWith((v1, v2) => { /* your comparison logic here */ }))
}
}
希望指出你正确的方向。