2010-10-22 131 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很好地匹配你的算法。

相關問題