scala按对象参数错误排序列表

时间:2010-10-22 19:33:32

标签: list scala sorting

好的,如果我知道该怎么做,我不会来找你帮忙,反正我的“程序”仍有问题。

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]

3 个答案:

答案 0 :(得分:6)

您必须先在toList致电marksGroupedIterable没有sortWith方法,但List没有。

答案 1 :(得分:6)

基本集合层次结构:

  • TraversableOnce:可能只能遍历一次,就像迭代器一样。
  • Traversable:可以使用foreach遍历,但不提供其他保证。
  • Iterable:可以生成iterator,它可以启用延迟遍历。
    • Seq:内容具有固定的遍历顺序。
      • IndexedSeq:可以通过位置编号有效地检索内容。
    • Set:内容只包含每种类型的一个元素。
    • Map:可以通过密钥有效地检索内容。

因此,您面临的问题是Iterable不支持定义遍历顺序,这是sortWith所做的。只有源自Seq的集合才能 - ListVectorArrayBuffer等。

方法toSeq将从Seq中返回Iterable。或者您可以选择更具体的集合,characteristics与您的算法匹配。

答案 2 :(得分:4)

对于额外的高阶编程优点,请使用sortBy,而不是sortWith

  val marksSorted = marksGrouped.toList.sortBy(_.style_mark)