Scala 列表[Map[Int,Object]]排序
您好,我是scala新手,不知道如何更改以下代码:Scala 列表[Map[Int,Object]]排序,scala,Scala,您好,我是scala新手,不知道如何更改以下代码: 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(it
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)
} )
}
我想按元素对列表进行排序,然后返回排序后的列表[profile]。我尝试了各种方法,但没有一种效果很好。
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.czasogladiana
,profil.czyKupil
等都是选项。在这种情况下,您应该首先检查它们是否已定义,然后再执行计算。您可以定义默认值,例如
// if profil.czasOgladania is defined, get the value. Else, return 10.
val count = profil.czasOgladania.getOrElse(10)
或:
您也可以使用排序方式
:
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))
}
这里是没有任何可变状态的全部内容(变量是不好的实践)。首先,将概要文件列表映射到(count,profile)元组列表。这张地图似乎没有必要。然后按元组中的第一项对列表进行排序,然后将其映射到配置文件列表(元组中的第二项)
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))
}
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)
}