2010-10-22 132 views
1

好的,如果我知道该怎么做,我不会来帮助你,反正,我的“程序”仍然有问题。scala根据对象参数错误对列表进行排序

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]

回答

5

你必须呼吁marksGroupedtoList第一。 Iterable没有sortWith方法,但List

+3

他需要调用toSeq ... – 2010-10-23 12:39:00

4

对于额外的高阶编程善良,使用sortBy,而不是sortWith

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

基本收集层次结构:

  • TraversableOnce:可能仅仅是一次穿越一样,迭代器。
  • Traversable:可能被遍历,与foreach,但没有提供其他担保。
  • Iterable:可以生成iterator,它可以启用惰性遍历。
    • Seq:内容具有固定的遍历顺序。
      • IndexedSeq:内容可以通过位置号有效检索。
    • Set:内容只包含每种类型的一个元素。
    • Map:内容可以通过密钥有效检索。

所以,你所面临的问题是Iterable不提供支持,以确定遍历顺序,这是sortWith呢。仅从Seq可以派生的集合 - ListVectorArrayBuffer

方法toSeq将返回SeqIterable的。或者你可以选择一个更具体的收集,与characteristics很好地匹配你的算法。

相关问题