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

paw*_*ior 1 sorting scala list

好吧,如果我知道该怎么做,我不会向你求助,无论如何,我的"程序"仍有问题.

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)

  }
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误: error: value sortWith is not a member of scala.collection.immutable.Iterable[Mark]

sep*_*p2k 6

你必须叫toListmarksGrouped第一.Iterable没有sortWith方法,但List确实如此.


Dan*_*ral 6

基本集合层次:

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

所以你面临的问题是Iterable没有提供支持来定义遍历顺序,这就是做什么的sortWith.仅从派生的集合Seq- CAN List,Vector,ArrayBuffer,等.

该方法toSeq将返回Seq一个Iterable.或者您可以选择更具体的集合,其特征与您的算法完全匹配.


Dav*_*ith 5

为了获得额外的高阶编程优势,请使用 sortBy,而不是 sortWith

  val marksSorted = marksGrouped.toList.sortBy(_.style_mark)
Run Code Online (Sandbox Code Playgroud)