Class: Lista

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

Overview

Clase Lista, representando una DLL (double linked list) para el almacenamiento de objetos en Ruby, con sus funcionalidades esenciales

# @author Fernando González Petit # @since 0.1.0 # @attr_reader head: [Node] Referencia a la primera posición de la lista tail: [Node] Referencia a la última posición de la lista size: [Integer] Tamaño actual de la lista

Incluye utilidades del módulo Enumerable

Defined Under Namespace

Classes: Node

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeLista

Las listas se inicializan vacías y con tamaño cero



40
41
42
43
44
# File 'lib/prct07/lista.rb', line 40

def initialize
	@head = nil
	@tail = nil
	@size = 0
end

Instance Attribute Details

#head=(value) ⇒ Object

Sets the attribute head

Parameters:

  • value

    the value to set the attribute head to.



14
15
16
# File 'lib/prct07/lista.rb', line 14

def head=(value)
  @head = value
end

#size=(value) ⇒ Object

Sets the attribute size

Parameters:

  • value

    the value to set the attribute size to.



14
15
16
# File 'lib/prct07/lista.rb', line 14

def size=(value)
  @size = value
end

#tail=(value) ⇒ Object

Sets the attribute tail

Parameters:

  • value

    the value to set the attribute tail to.



14
15
16
# File 'lib/prct07/lista.rb', line 14

def tail=(value)
  @tail = value
end

Instance Method Details

#clasifyObject

Método específico para uso de listas de objetos de la clase Etiqueta Ordena las Etiquetas en la lista por sus valores aceptables de sal

Returns:

  • Un array bidimensional - Contiene dos vectores, cada uno con las Etiquetas con mucha/poca sal, respectivamente

See Also:



221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
# File 'lib/prct07/lista.rb', line 221

def clasify
    sol = []
    ans1 = []
    ans2 = []

    pointer = @head

    while !(pointer.nil?)
        
	if(pointer.value.sal < 6)
	   ans1.append(pointer.value.sal)
	else
	   ans2.append(pointer.value.sal)
	end

	pointer = pointer.next
    end

    sol.append(ans1,ans2)
end

#clasify_p8Object

Método específico para uso de listas de objetos de la clase Paciente Clasifica en función de su peso a Individuos con historial médico (Paciente)

Returns:

  • Array bidimensional con los pacientes ordenados por su peso en distintos vectores

See Also:



248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
# File 'lib/prct07/lista.rb', line 248

def clasify_p8
    sol = []
    low_w = []
    adq_w = []
    ove_w = []
    ob1_w = []
    ob2_w = []

    pointer = @head

    while !(pointer.nil?)
	    val = pointer.value.imc
	    if(val < 18.5)
		    low_w.append(pointer.value)
	    elsif(val > 18.5 and val < 24.9)
		    adq_w.append(pointer.value) 
	    elsif(val > 25.0 and val < 29.9) 
		    ove_w.append(pointer.value)
	    elsif(val > 30.0 and val < 34.9)
		    ob1_w.append(pointer.value)
	    elsif(val > 40) 
		    ob2_w.append(pointer.value)
	    end

	    pointer = pointer.next
    end
    
    sol.append(low_w,adq_w,ove_w,ob1_w,ob2_w)
end

#eachObject

Método each para utilidades de enumerable

yield

Objeto dentro del nodo en la posición del recorrido secuencial de la lista

See Also:

Author:

  • Fernando González Petit



31
32
33
34
35
36
37
# File 'lib/prct07/lista.rb', line 31

def each
	pointer = @head
	while !(pointer.nil?)
		yield pointer.value 
		pointer = pointer.next
	end
end

#emptyBoolean, true

Returns Si el tamaño es 0

Boolean, false

Si el tamaño es mayor que 0.

Returns:

  • (Boolean, true)

    Si el tamaño es 0

    Boolean, false

    Si el tamaño es mayor que 0



63
64
65
# File 'lib/prct07/lista.rb', line 63

def empty
  return (size == 0)
end

#extract_headObject

Equivalente al pop_head. Extrae el elemento en la cabeza de la lista

Returns:

  • Objeto en el nodo extraído, en caso de haberlo



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

def extract_head
  if(@size > 0)
    v = @head
    @head = @head.next
    
    if(@head == nil)
        @tail = nil
    end
    
    @size -= 1

    return v.value
  end

         nil
end

#extract_tailObject

Equivalente al pop_tail. Extrae el elemento en la cola de la lista

Returns:

  • Objeto en el nodo extraído, en caso de haberlo



186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
# File 'lib/prct07/lista.rb', line 186

def extract_tail
  if(@size > 0)
    v = @tail
    @tail = @tail.prev
    
    if(@tail == nil)
        @head = nil
    end
    
    @size -= 1

    return v.value
  end

  nil
end

#get_headObject

Returns Head actual.

Returns:

  • Head actual



47
48
49
# File 'lib/prct07/lista.rb', line 47

def get_head
  @head
end

#get_sizeObject

Returns Size actual.

Returns:

  • Size actual



57
58
59
# File 'lib/prct07/lista.rb', line 57

def get_size
  @size
end

#get_tailObject

Returns Tail actual.

Returns:

  • Tail actual



52
53
54
# File 'lib/prct07/lista.rb', line 52

def get_tail
  @tail
end

#insert_head(etiqueta) ⇒ Object

Método que inserta el elemento etiqueta a la cabeza de la lista

Parameters:

  • etiqueta

    Cualquier objeto

Author:

  • Fernando González Petit



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/prct07/lista.rb', line 72

def insert_head(etiqueta)
    #prev va a ser vacio siempre
    nod = Node.new(etiqueta, nil, nil)
    
    if self.empty
       nod.next = nil
       nod.prev = nil
       @head = nod
       @tail = nod
    else
       nod.next = @head
     	       nod.prev = nil
       @head.prev = nod
       @head = nod	       
    end

	    @size += 1

    nil  
end

#insert_tail(etiqueta) ⇒ Object

Método que inserta el elemento etiqueta a la cola de la lista

Parameters:

  • etiqueta

    Cualquier objeto

Author:

  • Fernando González Petit



99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/prct07/lista.rb', line 99

def insert_tail(etiqueta)
    #next va a ser vacio siempre
    nod = Node.new(etiqueta, nil, nil)
    
    if self.empty
       nod.next = nil
       nod.prev = nil
       @head = nod
       @tail = nod
    else
       nod.prev = @tail
     	       nod.next = nil
       @tail.next = nod
       @tail = nod	       
    end

           @size += 1

    nil
end

#item_at(pos) ⇒ Object

Método que obtiene el elemento en la posición pos de la lista

Parameters:

  • pos (Integer)

    posición en la lista

Returns:

  • Elemento seleccionado

Author:

  • Fernando González Petit



127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/prct07/lista.rb', line 127

def item_at(pos)
          if(pos <= size)	    
	var = 1
	pointer = @head
   
       	while var < pos
	    pointer = pointer.next
	    var += 1    
       	end
   else
     return nil
   end

   pointer.value
end

#item_at_t(pos) ⇒ Object

Duplicación del método item_at pero realizando la búsqueda desde la cola

See Also:

  • item_at


146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
# File 'lib/prct07/lista.rb', line 146

def item_at_t(pos)

          if(pos <= size)	    
	var = 1
	pointer = @tail
   
       	while var < pos
	    pointer = pointer.prev
	    var += 1    
       	end
   else
     return nil
   end

   pointer.value
end

#my_sort_eachObject



303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
# File 'lib/prct07/lista.rb', line 303

def my_sort_each
	result = []
	self.map.with_index{ |x, i| result.insert(i, x) }

	n = result.length-1

	loop do
		swapped = false

		n.times.each do |i|
			if (result[i].gasto_ene_total(0.12) > result[i+1].gasto_ene_total(0.12))
				result[i], result[i+1] = result[i+1], result[i]		
				swapped = true
			end
		end

		break if not swapped
	end

	result

end

#my_sort_forObject



280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
# File 'lib/prct07/lista.rb', line 280

def my_sort_for
	result = []
	self.map.with_index{ |x, i| result.insert(i, x) }

	n = result.length

	loop do
		swapped = false

		for i in 0...(n-1)
			if (result[i].gasto_ene_total(0.12) > result[i+1].gasto_ene_total(0.12))
				result[i], result[i+1] = result[i+1], result[i]		
				swapped = true
			end
		end

		break if not swapped
	end

	result

end

#to_sObject

Devuelve en forma de cadena una salida formateada de todos los elementos en la lista por orden



204
205
206
207
208
209
210
211
212
213
# File 'lib/prct07/lista.rb', line 204

def to_s
	cad = ""
	pointer = @head
	while !(pointer.nil?)
	  cad += pointer.value.to_s
	  cad += "\n"
	  pointer = pointer.next
	end
 	cad
end