miércoles, 22 de agosto de 2012

Listas complejas

Si lo que queremos es crear listas mas complejas conteniendo datos de diferentes tipos yo recomiendo crear un objeto y después crear una lista de este objeto.

// complila con valac  nombre.gs  --pkg gee-1.0

[indent=4]
uses Gee
//creamos la clase casa

class casa: Object
    Portal: int
    Piso:int
    Puerta:string
    Calle:string


casa0:casa
init
    var lista_de_casas = new list of casa
 

    //Instanciamos el objeto casa
    casa0= new casa()
    //Introducimos datos
    casa0.Portal=4
    casa0.Piso=3
    casa0.Puerta="A"
    casa0.Calle ="Calle Mayor"
    //Introducimos en la lista
    lista_de_casas.add(casa0)
   
    // Si queremos obtener un nuevo item en la lista deberemos reinstanciar
    // el objeto casa y lo podemos hacer con el mismo nombre
    casa0= new casa()
    casa0.Portal=6
    casa0.Piso=7
    casa0.Puerta="B"
    casa0.Calle ="Calle Menor"
    lista_de_casas.add(casa0)
   
    for var e in lista_de_casas
        print e.Calle+" "+e.Portal.to_string()+ "-"+ e.Piso.to_string()+ " "+e.Puerta+ " "
    // este for tiene un warning consigo fallo de la librería gee
   



En este tipo de listas podríamos introducir tipos de variables creados por nosotros desde otros objetos o usar otros que ya están creados como los de las librerías SDL. Por ejemplo : Rect y Surface. Es decir, podemos anidar objetos dentro de otros y todos meterlos en una lista. En el siguiente ejemplo Introduciremos un objeto dentro de otro objeto, es decir el objeto persona lo introduciremos dentro del objeto casa. Pero claro esta que los objetos necesitan instanciarse para ser usados y si el objeto casa quiere usar el objeto persona este debe de haber sido correctamente instanciado. Lo haré mediante el constructor de casa. Aún así lo podría haber hecho a través de init. ¿Para que sirve el constructor? Es el que recoge las variables de construccion del objeto cuando lo instanciamos con new. En este caso no tiene ninguna. init al igual que construct se ejecutan cuando instanciamos el objeto con new. Sin embargo se dispara antes que construct. Pero bueno, dejemos esto de la construccion de objetos para otro capítulo.

[indent=4]
uses Gee
class persona: Object
    Nombre:string
    Apellidos:string
    
class casa: Object
    Portal: int
    Piso:int
    Puerta:string
    Calle:string
    Persona:persona
    construct () // también se podría haber puesto init aquí.
        Persona= new persona()
casa0:casa
e:Collection
init
    var lista_de_casas = new list of casa
    //Instanciamos el objeto casa
    casa0= new casa()
    //Introducimos datos
    casa0.Portal=4
    casa0.Piso=3
    casa0.Puerta="A"
    casa0.Calle ="Calle Mayor"
    casa0.Persona.Nombre="Gorka"
    casa0.Persona.Apellidos="Santos Garmendia"
    
    //Introducimos en la lista
    lista_de_casas.add(casa0)
    
    // Si queremos obtener un nuevo item en la lista deberemos reinstanciar
    // el objeto casa y lo podemos hacer con el mismo nombre
    casa0= new casa()
    casa0.Portal=6
    casa0.Piso=7
    casa0.Puerta="B"
    casa0.Calle ="Calle Menor"
    casa0.Persona.Nombre="Gaizka"
    casa0.Persona.Apellidos="Sanchez Soler"
    lista_de_casas.add(casa0)
    
    for e in lista_de_casas
        print e.Persona.Nombre + " " +e.Persona.Apellidos
        print e.Calle+ " "+ e.Portal.to_string()+ "-"+ e.Piso.to_string()+ " "+ e.Puerta+ " \n"
        
    // este for tiene un warnin consigo fallo de la librería gee
    



Si lo necesitamos también podemos incluir listas dentro de los objetos. Imaginemos que dentro del objeto persona introducimos una lista de los nombres de los hijos, el resultado sería el siguiente. No olvideís que las listas dentro de las clases también tienen que ser inicializadas.


uses Gee

class persona: Object
    Nombre:string
    Apellidos:string
    Hijos:new list of string
    init
        Hijos= new list of string //inicializamos la lista de hijos así.
   
class casa: Object
    Portal: int
    Piso:int
    Puerta:string
    Calle:string
    Persona:persona
    init
        Persona= new persona()
casa0:casa
e:Collection
init
    var lista_de_casas = new list of casa
    //Instanciamos el objeto casa
    casa0= new casa
    //Introducimos datos
    casa0.Portal=4
    casa0.Piso=3
    casa0.Puerta="A"
    casa0.Calle ="Calle Mayor"
    casa0.Persona.Nombre="Gorka"
    casa0.Persona.Apellidos="Santos Garmendia"
    casa0.Persona.Hijos.add("Felipe") // introducimos los hijos dentro de la sublista
    casa0.Persona.Hijos.add("Rosa")
    casa0.Persona.Hijos.add("Marta")

   
    //Introducimos en la lista
    lista_de_casas.add(casa0)
   
    // Si queremos obtener un nuevo item en la lista deberemos reinstanciar
    // el objeto casa y lo podemos hacer con el mismo nombre
    casa0= new casa()
    casa0.Portal=6
    casa0.Piso=7
    casa0.Puerta="B"
    casa0.Calle ="Calle Menor"
    casa0.Persona.Nombre="Gaizka"
    casa0.Persona.Apellidos="Sanchez Soler"
    casa0.Persona.Hijos.add("Leire")
    casa0.Persona.Hijos.add("Agurtzane")
    lista_de_casas.add(casa0)
   
    for e in lista_de_casas
        print e.Persona.Nombre + " " +e.Persona.Apellidos
        for hijo in e.Persona.Hijos // imprimimos la lista de hijos
            print "Hijo:"+hijo
          
        print e.Calle+ " "+ e.Portal.to_string()+ "-"+ e.Piso.to_string()+ " "+ e.Puerta+ " \n"
      
    // este for tiene un warnin consigo fallo de la librería gee

No hay comentarios:

Publicar un comentario en la entrada