Scala 列表[Map[Int,Object]]排序

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

您好,我是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(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)
}