class Lista

Clase Lista que contendra diversos nodos enlazados entre si

Attributes

head[R]
size[R]
tail[R]

Public Class Methods

new(head) click to toggle source
# File lib/practica/lista.rb, line 6
def initialize(head)   #constructor
        @size = 1                     #inicializamos el size de la lista a 1
        @gei=0.0                      #establecemos @terreno y @ gei total a 0
        @terreno=0.0
        @cadena ="#{head.to_s}"       # creamos el objeto lista formateado a string
        @nuevo = Node.new(head,nil,nil)       # creamos el nodo con el objeto que le pasamos por parametro
        @head = @nuevo                # establecemos que tanto la cabeza como la cola son el mismo, pues la lista solo tiene un nodo
        @tail = @nuevo
        
end

Public Instance Methods

[](index) click to toggle source
# File lib/practica/lista.rb, line 24
        def [] (index)                                 #operador de acceso segun un indice
        if index.is_a?Integer           #verificamos que el indice es un entero
            if index== 0                        # en caso de que sea 0, retornamos head
                return @head.get_this
            elsif index== (@size -1)    #en caso de que sea el ultimo, retornamos head
                return @tail.get_this
            elsif index< (@size -1) && index> 0         # en otro caso, recorremos la lista hasta encontrar el nodo que corresponda al indice
                iterator= @head
                index.times{iterator= iterator.next}
                return iterator.get_this
            else                                # en cualquier otro caso retornamos nil
                return nil
            end
        end
        return nil
end
buscar(dato,siguiente,anterior) click to toggle source
# File lib/practica/lista.rb, line 42
def buscar (dato,siguiente,anterior)           #metodo para buscar un Alimento dentro de la lista
        
        
        @actual = @head                                                        #nodo con el que vamos a comparar
        @encontrado = false                                            # condicion de parada
        

        while (@actual != nil && @encontrado ==false) do  #  bucle que recorre todos los nodos hasta que o bien encuentra una coincidencia o hasta que no hayan mas nodos
                
                if (dato == @actual.get_valor ) then                 # si coincide
                        
                        if((siguiente == nil )&& (@actual.get_siguiente==nil)) then # en caso de que no haya siguiente
                                
                                if(@actual.get_prev.get_valor == anterior) then    # si el anterior coincide
                                        
                                        @encontrado=true  # lo encontamos
                                end


                        elsif (anterior==nil && @actual.get_prev== nil) then        # en caso de que no haya anterior
                                
                                if(@actual.get_siguiente.get_valor == siguiente)then   # comparamos con el siguiente
                                        @encontrado=true          # lo encontramos
                                end



                        elsif(@actual.get_prev != nil && @actual.get_siguiente !=nil) #verificamos que tanto siguiente como anterior no son nil
                                if(@actual.get_siguiente.get_valor ==siguiente && @actual.get_prev.get_valor == anterior ) then    #si tanto anterior como siguiente coinciden
                                        @encontrado=true                          # lo encontramos
                                else
                                        @actual=@actual.get_siguiente     # em caso contrario avanzamos
                                end


                        else        #si no coincide anterior y siguiente

                                @actual=@actual.get_siguiente      # obtenemos el siguiente nodo
                        end 


                else                                                                 #si no
                        @actual=@actual.get_siguiente       # obtenemos el siguiente nodo
                end
        end
        
        return @encontrado            #retornamos si lo encontramos o no
end
each() { |get_valor| ... } click to toggle source
# File lib/practica/lista.rb, line 16
def each       #operador each para Enumerable
        @i = head     #indice que empieza en head
        while (@i != nil)     # bucle para recorrer la lista, hasta que el indice sea nil ( el siguiente despues de la cola)
                yield @i.get_valor           # marcamos el valor del nodo en el que se encuentra el indice
                @i=@i.get_siguiente          # hacemos que el indice avance al proximo nodo
        end
end
get_gei() click to toggle source
# File lib/practica/lista.rb, line 123
def get_gei            #metodo que obtiene el total de GEI de todos los alimentos dentro de la lista
        @actual = @head


        while (@actual != nil ) do  #  bucle que recorre todos los nodos hasta que o bien encuentra una coincidencia o hasta que no hayan mas nodos
                @gei= @gei +@actual.get_valor.get_GEI
                @actual = @actual.get_siguiente
        end
        
        return @gei.round(2)

end
get_gei_y() click to toggle source
# File lib/practica/lista.rb, line 136
def get_gei_y                  #metodo que obtioene el GEI por año

        return (self.get_gei * 365).round(2)
end
get_terreno() click to toggle source
# File lib/practica/lista.rb, line 141
def get_terreno                #metodo que obtiene el terreno total de todos los Alimentos de la lista
        @actual = @head


        while (@actual != nil ) do  #  bucle que recorre todos los nodos hasta que o bien encuentra una coincidencia o hasta que no hayan mas nodos
                @terreno= @terreno +@actual.get_valor.get_terreno
                @actual = @actual.get_siguiente
        end
        
        return @terreno.round(2)

end
insertar(nuevo) click to toggle source
# File lib/practica/lista.rb, line 103
def insertar(nuevo)            #metodo para insertar un Alimento por la cabeza
        @size = @size +1
        @nodo_nuevo = Node.new(nuevo,nil,nil)

        @head.set_prev(@nodo_nuevo.get_this)
        @aux = @head.get_this
        @head = @nodo_nuevo.get_this
        @head.set_next(@aux.get_this)

        return @head.get_valor
end
insertar_back(nuevo) click to toggle source
# File lib/practica/lista.rb, line 91
def insertar_back(nuevo)       #metodo para insertar un Alimento por el final de la lista
        @size = @size +1
        @nodo_nuevo = Node.new(nuevo,nil,nil)

        @tail.set_next(@nodo_nuevo.get_this)
        @aux=@tail.get_this
        @tail = @nodo_nuevo.get_this
        @tail.set_prev(@aux.get_this)

        return @tail.get_valor
end
insertar_list(lista) click to toggle source
# File lib/practica/lista.rb, line 115
def insertar_list(lista) # metodo que se encarga de enlazar dos listas
                @size = @size+lista.size
                @tail.set_next(lista.head.get_this)
                lista.head.set_prev(@tail.get_this)
                @tail=lista.tail.get_this
                return @tail
        end
pop() click to toggle source
# File lib/practica/lista.rb, line 154
def pop                        # metodo que saca un alimento desde la cabeza
        @size = @size -1
        @aux = @head
        @head =@head.get_siguiente
        @head.set_prev(nil)
        @aux.set_next(nil)
        return @aux.get_valor
end
pop_back() click to toggle source
# File lib/practica/lista.rb, line 163
def pop_back   # metodo que saca un alimento desde la cola
        @size = @size-1
        @aux =@tail
        @tail = @tail.get_prev
        @tail.set_next(nil)
        @aux.set_prev(nil)

        return @aux.get_valor
end
to_s() click to toggle source
# File lib/practica/lista.rb, line 173
def to_s               #metodo que formatea la lista en un string
        @actual = @head.get_siguiente
        if(@actual != nil) then 

                while (@actual!=nil) do

                        @cadena= @cadena + ",#{@actual.get_valor.to_s}"
                        @actual = @actual.get_siguiente
                end

        end


return @cadena
end