Scala如何按对象字段(Object.field)对对象列表进行排序?
我有以下类型的数据:Scala如何按对象字段(Object.field)对对象列表进行排序?,scala,list,object,Scala,List,Object,我有以下类型的数据: case class TipoDeDato[T] (nombreCampo: String,valor: T) 在我的练习中,我需要使用我提到的数据类型创建以下结构: 因此,我创建了以下结构 val registro0: List[TipoDeDato[_>: String with Int]] = List( new TipoDeDato[String]("Autor", "Gabo"), new TipoDeDato[String]("Tit
case class TipoDeDato[T] (nombreCampo: String,valor: T)
在我的练习中,我需要使用我提到的数据类型创建以下结构:
因此,我创建了以下结构
val registro0: List[TipoDeDato[_>: String with Int]] = List(
new TipoDeDato[String]("Autor", "Gabo"),
new TipoDeDato[String]("Titulo", "100 Años"),
new TipoDeDato[Int]("Numero de Paginas", 700)
)
val registro1: List[TipoDeDato[_>: String with Int]] = List(
new TipoDeDato[String]("Autor", "Gabo"),
new TipoDeDato[String]("Titulo", "Maria"),
new TipoDeDato[Int]("Numero de Paginas", 1200)
)
val registro2: List[TipoDeDato[_>: String with Int]] = List(
new TipoDeDato[String]("Autor", "Gabo"),
new TipoDeDato[String]("Titulo", "Carrasco"),
new TipoDeDato[Int]("Numero de Paginas", 150)
)
val registro3: List[TipoDeDato[_>: String with Int]] = List(
new TipoDeDato[String]("Autor", "Gabo"),
new TipoDeDato[String]("Titulo", "Oceano"),
new TipoDeDato[Int]("Numero de Paginas", 200)
)
为了创建Libros对象,我做了以下工作:
val Libros: List[List[TipoDeDato[_>: String with Int]]] = List(registro0,registro1,registro2,registro3)
我的问题是,如何按Libros对象的任何组件Autor、Titulo、Numero de paginas对Libros对象进行排序?此结构是否足以满足我需要执行的操作?要对列表进行排序:
事实上,我认为你需要:
case class Dato(autor: String, titulo: String, numeroDePaginas: Int)
class TablaItems(var registros: List[Dato]){
def insertInto(reg: List[Dato]): TablaItems = {
registros = registros ::: reg
this
}
}
//you can also do (if you prefer) `Dato(author = "HGabo", titulo = "ZLa María", numeroDePaginas = 752)
val registro0 = Dato("HGabo", "ZLa María", 752)
val registro1 = Dato("AGabo", "CLa María", 521)
val Registros1: List[Dato] = List(registro0)
val Registros2: List[Dato] = List(registro1)
val tablaLibros = new TablaItems(Registros1)
tablaLibros.registros.foreach(println)
println("----")
tablaLibros.insertInto(Registros2)
tablaLibros.registros.foreach(println)
println("----")
tablaLibros.registros.sortBy(_.numeroDePaginas)
另外,如果这个问题需要函数式编程,没有副作用,而且我去掉了OOP,但是后者不是强制性的,OOP和FP是正交的:
case class TablaItems(registros: List[Dato])
implicit class TablaItemsOperations(tabla: TablaItems){
def withData(reg: List[Dato]) = TablaItems(tabla.registos :: reg)
}
...
val tablaLibros = TablaItems(Registros1)
tablaLibros.registros.foreach(println)
println("----")
val tablaLibrosUpdated = tablaLibros.withData(Registros2)
tablaLibrosUpdated.registros.foreach(println)
println("----")
tablaLibrosUpdated.registros.sortBy(_.numeroDePaginas)
您的问题没有很好地定义:首先,您在示例中对不同的数据类型进行排序-Int和String-排序顺序是如何定义的?例如,752是否大于或小于HGabo?第二,如何定义这些项目列表的顺序?从最长列表到最短列表?列表最大值的顺序?嗨,我需要排序,按字段new TipoDeDato[Int]页码,752,举例说明。我不知道是否有这种可能的sea数据结构,或者我是否必须改变它。嗨,我改变了它。我有一个列表列表,如何按NumeroDePaginas对象排序?顺便说一句,实例化case类不需要做新的工作。TipoDeDatoAutorHGabo也足够让TipoDeDato成为一种特质:密封特质TipoDeDato;case class Autor Autor:String扩展了TipoDeDato。。。。这将大大简化您的代码,尤其是类型签名哇!你是最棒的,非常感谢!请原谅我糟糕的英语:没问题!谢谢你的西班牙语课:嗯,如果我想按Titulo[String]或Autor[String]对列表进行排序?@jamlhet tablaLibros.registros.sortWith_uuz.Autor<\ux。autor@jamlhet您可以在此处获得更多信息:
case class TablaItems(registros: List[Dato])
implicit class TablaItemsOperations(tabla: TablaItems){
def withData(reg: List[Dato]) = TablaItems(tabla.registos :: reg)
}
...
val tablaLibros = TablaItems(Registros1)
tablaLibros.registros.foreach(println)
println("----")
val tablaLibrosUpdated = tablaLibros.withData(Registros2)
tablaLibrosUpdated.registros.foreach(println)
println("----")
tablaLibrosUpdated.registros.sortBy(_.numeroDePaginas)