Scala如何按对象列出对象列表字段(Object.field)?

时间:2017-07-25 00:53:55

标签: scala list object

我有以下类型的数据:

case class TipoDeDato[T] (nombreCampo: String,valor: T)

在我的练习中,我需要使用我提到的数据类型创建以下结构:

Data Structure

所以,我创建了以下结构

  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)

我的问题是,如何对&#34; Libros&#34;进行排序?对象,由其任何组件,&#34; Autor&#34;,&#34; Titulo&#34;,&#34; Numero de paginas&#34;?,这个结构是否适合我需要做的事情?< / p>

1 个答案:

答案 0 :(得分:1)

List的{​​{1}}进行排序:

List

其实我觉得你需要:

sealed trait TipoDeDato

case class Autor (autor: String) extends TipoDeDato
case class Titulo (titulo: String) extends TipoDeDato
case class NumeroDePaginas (numeroDePaginas: Int) extends TipoDeDato

class TablaItems(var registros: List[List[TipoDeDato]]){
  def insertInto(reg: List[List[TipoDeDato]]): TablaItems = {
    registros = registros ::: reg
    this
  }
}

  val registro0: List[TipoDeDato] = List(
    Autor("HGabo"), 
    Titulo("ZLa María"),
    NumeroDePaginas(752)
  )

  val registro1: List[TipoDeDato] = List(
    Autor("AGabo"),
    Titulo("CLa María"),
    NumeroDePaginas(521)
  )

  val Registros1: List[List[TipoDeDato]] = List(registro0)
  val Registros2: List[List[TipoDeDato]] = List(registro1)

  val tablaLibros = new TablaItems(Registros1)
  tablaLibros.registros.foreach(println)
  println("----")
  tablaLibros.insertInto(Registros2)
  tablaLibros.registros.foreach(println)
  println("----")
  tablaLibros.registros.sortBy(r=>r.collectFirst{
      case NumeroDePaginas(n) => n
  }.getOrElse(0))

另外,如果这个问题需要函数编程(没有副作用,我也摆脱了OOP - 但后者不是强制性的,OOP和FP是正交的):

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)