好的,如果我知道该怎么做,我不会来找你帮忙,反正我的“程序”仍有问题。
class Mark(val name: String, val style_mark: Double, val other_mark: Double) {}
object Test extends Application
{
val m1 = new Mark("Smith", 18, 16);
val m2 = new Mark("Cole", 14, 7);
val m3 = new Mark("James", 13, 15);
val m4 = new Mark("Jones", 14, 16);
val m5 = new Mark("Richardson", 20, 19);
val m6 = new Mark("James", 4, 18);
val marks = List[Mark](m1, m2, m3, m4, m5, m6);
def avg(xs: List[Double]) = xs.sum / xs.length
val marksGrouped = marks.groupBy(_.name).map { kv => new Mark(kv._1, avg(kv._2.map(_.style_mark)), avg(kv._2.map(_.other_mark))) }
val marksSorted = marksGrouped.sortWith((m1, m2) => m1._style_mark < m2._style_mark)
}
这是我得到的错误:error: value sortWith is not a member of scala.collection.immutable.Iterable[Mark]
答案 0 :(得分:6)
您必须先在toList
致电marksGrouped
。 Iterable
没有sortWith
方法,但List
没有。
答案 1 :(得分:6)
基本集合层次结构:
TraversableOnce
:可能只能遍历一次,就像迭代器一样。Traversable
:可以使用foreach
遍历,但不提供其他保证。Iterable
:可以生成iterator
,它可以启用延迟遍历。
Seq
:内容具有固定的遍历顺序。
IndexedSeq
:可以通过位置编号有效地检索内容。Set
:内容只包含每种类型的一个元素。Map
:可以通过密钥有效地检索内容。因此,您面临的问题是Iterable
不支持定义遍历顺序,这是sortWith
所做的。只有源自Seq
的集合才能 - List
,Vector
,ArrayBuffer
等。
方法toSeq
将从Seq
中返回Iterable
。或者您可以选择更具体的集合,characteristics与您的算法匹配。
答案 2 :(得分:4)
对于额外的高阶编程优点,请使用sortBy,而不是sortWith
val marksSorted = marksGrouped.toList.sortBy(_.style_mark)