我正在尝试制作一个可与其他序列比较的序列(例如,其他集合类型也是可行的)。Seq [A]扩展顺序[Seq [A]]
class RichSeq[A](val seq: Seq[A]) extends Ordered[RichSeq[A]]
当然有在refered包对象中的隐式转换:
implicit def seq2RichSeq[A](s: Seq[A]) = new RichSeq(s)
比较装置,第一尺寸比事项每个元素。代码清楚:
class RichSeq[A](val seq: Seq[A]) extends Ordered[RichSeq[A]] {
def compare(s: RichSeq[A]) = {
seq.size compare s.seq.size match {
case 0 => seq.view.zip(s.seq).map { case (x,y) => ord.compare(x,y) }.dropWhile(_ == 0).headOption.getOrElse(0)
case x => x
}
}
}
但是,这不`吨编译(当然),因为一个需要排序的元素比较,所以我试过了:
class RichSeq[A](val seq: Seq[A]) extends Ordered[RichSeq[A]] {
def compare(s: RichSeq[A])(implicit ord: Ordering[A]) = {
// ...
}
}
现在的签名比较方法是不适合的,所以我提出的隐式ord
到类签名(并且适于隐式转换):
implicit def seq2RichSeq[A](s: Seq[A])(implicit ord: Ordering[A]) = new RichSeq(s)
class RichSeq[A](val seq: Seq[A])(implicit ord: Ordering[A]) extends Ordered[RichSeq[A]] {
def compare(s: RichSeq[A]) = {
// ...
}
}
但现在我有一个问题,即在的所有其它方法,我想通过implicit
在Seq[A]
使用也需要一个隐含的Ordering[A]
,我不能总是提供一个。有时候我使用我的RichSeq
通过没有排序的方法和有时使用比较方法。
例如,有时我叫
def distinctBy[B](f: A => B): Seq[A] = {
seq.foldLeft { (Buffer[A](),MutMap[B,A]()) } {
case ((b,m),x) if m contains f(x) => (b,m)
case ((b,m),x) =>
m += f(x) -> x
b += x
(b,m)
}._1
}
同时我不能定义一个Ordering[A]
。
我看到有两个不同的类(有两个隐式转换)一个解决办法:
class RichSeqOrderable[A](val seq: Seq[A])(implicit ord: Ordering[A]) extends Ordered[RichSeqOrderable[A]]
class RichSeq[A](val seq: Seq[A])
但我认为,打破让所有的东西在一起的念头?!?
我会去两个班,但在同一个文件。 – Anonymous 2011-03-11 18:00:17
http://stackoverflow.com/questions/4493242/why-dont-scala-lists-have-an-ordering – 2011-03-11 21:20:38