Class: Lista

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/huella/lista.rb

Overview

Es una abstración de una lista doblemente enlazada, es decir se puede recorrer en ambos

sentidos. En otras palabras, se puede ver como una aproximación de array. 
Tiene un puntero a cada extremo de la lista:
* Puntero al nodo cabeza
* Puntero al nodo cola

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(head = nil, tail = nil, arrayElementos = nil) ⇒ Lista

Returns a new instance of Lista.



14
15
16
17
18
19
20
21
# File 'lib/huella/lista.rb', line 14

def initialize(head = nil, tail = nil, arrayElementos = nil)
    @head = head
    @tail = tail

    if(arrayElementos != nil)
        self.pushAll(arrayElementos)
    end
end

Instance Attribute Details

#headObject (readonly)

Returns the value of attribute head.



12
13
14
# File 'lib/huella/lista.rb', line 12

def head
  @head
end

#tailObject (readonly)

Returns the value of attribute tail.



12
13
14
# File 'lib/huella/lista.rb', line 12

def tail
  @tail
end

Instance Method Details

#==(other) ⇒ Object

Dos listas son iguales si tienen exactamente los mismos elementos y en el mismo orden



125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# File 'lib/huella/lista.rb', line 125

def ==(other)

    if(self.cantNodos != other.cantNodos)
        return false
    else
        self.each_with_index do |elemento, index|
            if(elemento != other.at(index))
                return false
            end
        end
    end

    return true

end

#at(pos) ⇒ Object

Accede a un elemento dada la posición



108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/huella/lista.rb', line 108

def at(pos)

    temp = nil

    #En caso de que no exista la posición, se devuelve el valor nil
    self.each_with_index do |elemento, index|
        if(index == pos)
            temp = elemento
            break
        end
    end

    temp

end

#cantNodosObject

Devuelve la cantidad de elementos



151
152
153
154
155
156
157
158
159
160
161
162
# File 'lib/huella/lista.rb', line 151

def cantNodos
    total = 0
    temp = @head

    while(temp != nil)
        temp = temp.next
        total += 1
    end

    total

end

#eachObject

Implementación del método each para utilizar los demás métodos del módulo enumerable



264
265
266
267
268
269
270
271
272
273
# File 'lib/huella/lista.rb', line 264

def each

    temp = @head
    
    while(temp != nil)
      yield temp.value
      temp = temp.next
    end

end

#getGeiAnualObject

Retorna los gases de efecto invernadero producidos en un año



231
232
233
# File 'lib/huella/lista.rb', line 231

def getGeiAnual
    (getGeiDiario * 365).round(2)
end

#getGeiDiarioObject

Retorna los gases de efecto invernadero producidos en un día



216
217
218
219
220
221
222
223
224
225
226
227
228
# File 'lib/huella/lista.rb', line 216

def getGeiDiario

    totalGei = 0
    temp = @head

    while(temp != nil)
        totalGei += temp.value.gei
        temp = temp.next
    end

    totalGei.round(2)

end

#getProcentajeCarbohidratosObject

Retorna en porcenataje el aporte de carbohidratos en el valor energético



182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
# File 'lib/huella/lista.rb', line 182

def getProcentajeCarbohidratos

    totalCarbohidratos = 0
    totalValorEnergetico = 0
    temp = @head

    while(temp != nil)
        totalCarbohidratos += temp.value.carbohidratos
        totalValorEnergetico += temp.value.getValorEnergetico
        temp = temp.next
    end

    ( (totalCarbohidratos * 100 * 4) / totalValorEnergetico ).round(2)

end

#getProcentajeLipidosObject

Retorna en porcenataje el aporte de lípidos en el valor energético



199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
# File 'lib/huella/lista.rb', line 199

def getProcentajeLipidos

    totalLipidos = 0
    totalValorEnergetico = 0
    temp = @head

    while(temp != nil)
        totalLipidos += temp.value.lipidos
        totalValorEnergetico += temp.value.getValorEnergetico
        temp = temp.next
    end

    ( (totalLipidos * 100 * 9) / totalValorEnergetico ).round(2)

end

#getProcentajeProteinasObject

Retorna en porcenataje el aporte de proteinas en el valor energético



165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
# File 'lib/huella/lista.rb', line 165

def getProcentajeProteinas

    totalProteinas = 0
    totalValorEnergetico = 0
    temp = @head

    while(temp != nil)
        totalProteinas += temp.value.proteinas
        totalValorEnergetico += temp.value.getValorEnergetico
        temp = temp.next
    end

    ( (totalProteinas * 100 * 4) / totalValorEnergetico ).round(2)

end

#getTerrenoTotalObject

Retorna el uso de terreno en un año



236
237
238
239
240
241
242
243
244
245
246
247
248
# File 'lib/huella/lista.rb', line 236

def getTerrenoTotal

    totalTerreno = 0
    temp = @head

    while(temp != nil)
        totalTerreno += temp.value.terreno
        temp = temp.next
    end

    totalTerreno.round(2)

end

#isVaciaObject

Retorna verdadero si la lista está vacia, en otro caso retorna falso



142
143
144
145
146
147
148
# File 'lib/huella/lista.rb', line 142

def isVacia
    if(cantNodos == 0)
        return true
    end

    return false
end

#popObject

Extae el último elemento



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/huella/lista.rb', line 68

def pop

    oldTail = @tail
    
    #Existen mínimo 2 nodos
    if( (@head != nil) && (@head.next != nil) )
        @tail = @tail.prev
        @tail.next=(nil)
        oldTail.prev=(nil)
    #Existe un solo nodo o ninguno
    else
        @head = nil
        @tail = nil
    end

    oldTail

end

#push(elemento) ⇒ Object

Inserta un elemento por la cola



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/huella/lista.rb', line 24

def push (elemento)
    nodoNuevo = Nodo.new(elemento)

    #La lista está vacia
    if(@head == nil)
        @head = nodoNuevo 
    else
        #Agrega el nuevo nodo al final de una lista no vacia
        @tail.next=(nodoNuevo)
        nodoNuevo.prev=(@tail)
    end

    #Actualiza la cola
    @tail = nodoNuevo

end

#pushAll(arrayElementos) ⇒ Object

Inserta varios elementos por la cola



42
43
44
45
46
# File 'lib/huella/lista.rb', line 42

def pushAll(arrayElementos)
    arrayElementos.each do |elemento|
        push(elemento)
    end
end

#shiftObject

Extae el primer elemento



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/huella/lista.rb', line 88

def shift

    oldHead = @head
    
    #Existen mínimo 2 nodos
    if( (@head != nil) && (@head.next != nil) )
        @head = @head.next
        @head.prev=(nil)
        oldHead.next=(nil)
    #Existe un solo nodo o ninguno
    else
        @head = nil
        @tail = nil
    end

    oldHead

end

#to_sObject

Retorna la Lista formateada



251
252
253
254
255
256
257
258
259
260
261
# File 'lib/huella/lista.rb', line 251

def to_s

    salida = []

    self.each do |elemento|
        salida << elemento
    end

    "[" + salida.join(" <-> ") + "]"

end

#unshift(elemento) ⇒ Object

Inserta un elemento por la cabeza



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/huella/lista.rb', line 49

def unshift (elemento)

    nodoNuevo = Nodo.new(elemento)

    #La lista está vacia
    if(@head == nil)
        @tail = nodoNuevo
    else
        #Agrega el nuevo nodo al principio de una lista no vacia
        nodoNuevo.next=(@head)
        @head.prev=(nodoNuevo)
    end

    #Actualiza la cabeza
    @head = nodoNuevo

end