2017-07-25 1 views
0

je le type de données suivantes:Scala Comment faire pour trier Liste des objets Liste par champ Objet (Object.field)?

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

Et dans mon exercice, je dois créer la structure suivante, en utilisant le type de données je l'ai mentionné:

Data Structure

Alors, je créé la structure suivante

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) 
) 

Et pour créer l'objet « Libros », je l'ai fait ce qui suit:

val Libros: List[List[TipoDeDato[_>: String with Int]]] = List(registro0,registro1,registro2,registro3) 

Ma question est, comment puis-je trier l'objet « Libros », par l'un de ses composants, « Autor », « titulo », « Nombre de paginas » ?, est cette structure adéquate pour ce que je dois faire?

+0

Vos questions ne sont pas bien définies: d'abord, vous triez des types de données différents (dans l'exemple - 'Int' et' String' - comment l'ordre de tri est-il défini? Par exemple. est 752 supérieur ou inférieur à "HGabo"? Et deuxièmement, comment l'ordre des listes de ces articles est-il défini? la plus longue liste au plus court? ordre des valeurs maximales des listes? –

+0

Salut, j'ai besoin tri, par champ "nouveau TipoDeDato [Int]" ("Numero de Paginas", 752) ", par exemple. Et je ne sais pas si avec cette structure de données de mer possible, ou si je dois le changer. – jamlhet

+0

Salut, je le change. J'ai List of List, comment trier par "NumeroDePaginas" objet? – jamlhet

Répondre

1

Pour trier List de 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)) 

En fait, je pense que vous avez besoin:

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) 

En outre, si ce problème nécessite une programmation fonctionnelle (pas d'effets secondaires, et aussi je me suis débarrassé de POO - cependant ce dernier n'est pas obligatoire, POO et FP sont orthogonaux):

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) 
+0

Wow! Vous êtes le meilleur, merci beaucoup! S'il vous plaît pardonnez mon moche anglais :( – jamlhet

+0

Pas de problème! Merci pour la leçon d'espagnol :) – dk14

+0

Ummm et si je veux trier la liste de la liste par "Titulo" [String] ou "Autor" [String]? – jamlhet