2014-05-11 49 views
0

嗨,我在新阶,我不知道如何更改下面的代码:列表[图[诠释,对象]排序

def makeProfil(listProfils: List[Profil]): List[Profil] ={ 

    // var newList = List[Profil] 
      var ll = List[Map[Int,Profil]]() 
    listProfils.foreach(item => { 

    var count = item.czasOgladania.get 
    if(item.czyKupil.get) count = count *4 ; 
    if(item.czyPrzeczytal.get) count = count *3 ; 
    if(item.czyWKarcie.get) count = count *2 ; 
    ll ::= Map (count -> item) 
    }) 

    } 

我想排序LL列表中元素计数从而返回排序列表[Profil]作为结果。我尝试了各种各样的东西,但都没有效果。

回答

1

List有一个方法,sortWith,它对您的列表进行排序,您可以在其中提供排序列表的条件。条件是一个函数,接受两个参数(两个配置文件),结果是布尔值,表明哪一个是“更大”。

所以,你可以做到以下几点:

ll.sortWith((p1, p2) => 
    getCount(p1) > getCount(p2) 
) 

其中

def getCount(profil: Profil) = { 
    var count = profil.czasOgladania.get 
    if(profil.czyKupil.get) count = count *4 ; 
    if(profil.czyPrzeczytal.get) count = count *3 ; 
    if(profil.czyWKarcie.get) count = count *2 ; 
    count 
} 

更新

顺便说一句,似乎profil.czasOgladaniaprofil.czyKupil等等,都是Option秒。在这种情况下,您应该首先检查它们是否已定义,并执行计算。你可以定义默认值,例如

// if profil.czasOgladania is defined, get the value. Else, return 10. 
val count = profil.czasOgladania.getOrElse(10) 

或:

if(profil.czyWKarcie.getOrElse(false)) count = count *2 
0

您还可以使用sortBy

def makeProfil(listProfils: List[Profil]): List[Profil] = { 
    def getCount(profil: Profil) = { 
    var count = profil.czasOgladania.get 
    if (profil.czyKupil.get) count *= 4 
    if (profil.czyPrzeczytal.get) count *= 3 
    if (profil.czyWKarcie.get) count *= 2 
    count 
    } 

    listProfils.sortBy(p => getCount(p)) 
} 
1

这里是没有任何可变状态整件事商(VAR是不好的做法)。首先,将配置文件列表映射到(计数,配置文件)元组列表。地图似乎不是必要的。然后,按照元组中的第一项对列表进行排序,然后将其映射到配置文件列表(元组中的第二项)。

def makeProfil(listProfils: List[Profil]): List[Profil] ={ 

    val profileCounts = listProfils.map(item => { 
     val count = item.czasOgladania.getOrElse(0) 
     val kupil = if(item.czyKupil.isDefined) 4 else 1 
     val przeczytal = if(item.czyPrzeczytal.isDefined) 3 else 1; 
     val wKarcie = if(item.czyWKarcie.isDefined) 2 else 1 ; 
     val finalCount = count * kupil * przeczytal * wKarcie 
     (count, item) 
    }) 
    profileCounts.sortBy(_._1).map(_._2) 
}