nutritional_calculator 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.DS_Store +0 -0
- data/.coveralls.yml +1 -0
- data/.gitignore +12 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/Gemfile +6 -0
- data/Guardfile +82 -0
- data/LICENSE.txt +21 -0
- data/README.md +44 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/docs/NutritionalCalculator.html +423 -0
- data/docs/NutritionalCalculator/Food.html +912 -0
- data/docs/NutritionalCalculator/FoodGroup.html +498 -0
- data/docs/NutritionalCalculator/LinkedList.html +1312 -0
- data/docs/NutritionalCalculator/LinkedList/Node.html +409 -0
- data/docs/_index.html +151 -0
- data/docs/class_list.html +51 -0
- data/docs/css/common.css +1 -0
- data/docs/css/full_list.css +58 -0
- data/docs/css/style.css +492 -0
- data/docs/file.README.html +138 -0
- data/docs/file_list.html +56 -0
- data/docs/frames.html +17 -0
- data/docs/index.html +138 -0
- data/docs/js/app.js +248 -0
- data/docs/js/full_list.js +216 -0
- data/docs/js/jquery.js +4 -0
- data/docs/method_list.html +275 -0
- data/docs/top-level-namespace.html +110 -0
- data/lib/files/food_database.config +22 -0
- data/lib/files/glycemic_index.config +8 -0
- data/lib/files/nutritional_file.txt +5 -0
- data/lib/files/nutritional_group.config +22 -0
- data/lib/nutritional_calculator.rb +55 -0
- data/lib/nutritional_calculator/food.rb +99 -0
- data/lib/nutritional_calculator/foodgroup.rb +32 -0
- data/lib/nutritional_calculator/linkedlist.rb +194 -0
- data/lib/nutritional_calculator/plate.rb +294 -0
- data/lib/nutritional_calculator/sort_methods.rb +34 -0
- data/lib/nutritional_calculator/version.rb +4 -0
- data/nutritional_calculator.gemspec +40 -0
- metadata +186 -0
@@ -0,0 +1,110 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
6
|
+
<title>
|
7
|
+
Top Level Namespace
|
8
|
+
|
9
|
+
— Documentation by YARD 0.9.9
|
10
|
+
|
11
|
+
</title>
|
12
|
+
|
13
|
+
<link rel="stylesheet" href="css/style.css" type="text/css" charset="utf-8" />
|
14
|
+
|
15
|
+
<link rel="stylesheet" href="css/common.css" type="text/css" charset="utf-8" />
|
16
|
+
|
17
|
+
<script type="text/javascript" charset="utf-8">
|
18
|
+
pathId = "";
|
19
|
+
relpath = '';
|
20
|
+
</script>
|
21
|
+
|
22
|
+
|
23
|
+
<script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
|
24
|
+
|
25
|
+
<script type="text/javascript" charset="utf-8" src="js/app.js"></script>
|
26
|
+
|
27
|
+
|
28
|
+
</head>
|
29
|
+
<body>
|
30
|
+
<div class="nav_wrap">
|
31
|
+
<iframe id="nav" src="class_list.html?1"></iframe>
|
32
|
+
<div id="resizer"></div>
|
33
|
+
</div>
|
34
|
+
|
35
|
+
<div id="main" tabindex="-1">
|
36
|
+
<div id="header">
|
37
|
+
<div id="menu">
|
38
|
+
|
39
|
+
<a href="_index.html">Index</a> »
|
40
|
+
|
41
|
+
|
42
|
+
<span class="title">Top Level Namespace</span>
|
43
|
+
|
44
|
+
</div>
|
45
|
+
|
46
|
+
<div id="search">
|
47
|
+
|
48
|
+
<a class="full_list_link" id="class_list_link"
|
49
|
+
href="class_list.html">
|
50
|
+
|
51
|
+
<svg width="24" height="24">
|
52
|
+
<rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
|
53
|
+
<rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
|
54
|
+
<rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
|
55
|
+
</svg>
|
56
|
+
</a>
|
57
|
+
|
58
|
+
</div>
|
59
|
+
<div class="clear"></div>
|
60
|
+
</div>
|
61
|
+
|
62
|
+
<div id="content"><h1>Top Level Namespace
|
63
|
+
|
64
|
+
|
65
|
+
|
66
|
+
</h1>
|
67
|
+
<div class="box_info">
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
</div>
|
80
|
+
|
81
|
+
<h2>Defined Under Namespace</h2>
|
82
|
+
<p class="children">
|
83
|
+
|
84
|
+
|
85
|
+
<strong class="modules">Modules:</strong> <span class='object_link'><a href="NutritionalCalculator.html" title="NutritionalCalculator (module)">NutritionalCalculator</a></span>
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
|
90
|
+
</p>
|
91
|
+
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
|
100
|
+
</div>
|
101
|
+
|
102
|
+
<div id="footer">
|
103
|
+
Generated on Tue Nov 14 20:38:37 2017 by
|
104
|
+
<a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
105
|
+
0.9.9 (ruby-2.3.1).
|
106
|
+
</div>
|
107
|
+
|
108
|
+
</div>
|
109
|
+
</body>
|
110
|
+
</html>
|
@@ -0,0 +1,22 @@
|
|
1
|
+
Huevo frito 14.1 0.0 19.5
|
2
|
+
Leche vaca 3.3 4.8 3.2
|
3
|
+
Yogurt 3.8 4.9 3.8
|
4
|
+
Cerdo 21.5 0.0 6.3
|
5
|
+
Ternera 21.1 0.0 3.1
|
6
|
+
Pollo 20.6 0.0 5.6
|
7
|
+
Bacalao 17.7 0.0 0.4
|
8
|
+
Atún 21.5 0.0 15.5
|
9
|
+
Salmón 19.9 0.0 13.6
|
10
|
+
Aceite de oliva 0.0 0.2 99.6
|
11
|
+
Mantequilla 0.7 0.0 83.2
|
12
|
+
Chocolate 5.3 47.0 30.0
|
13
|
+
Azúcar 0.0 99.8 0.0
|
14
|
+
Arroz 6.8 77.7 0.6
|
15
|
+
Lentejas 23.5 52.0 1.4
|
16
|
+
Papas 2.0 15.4 0.1
|
17
|
+
Tomate 1.0 3.5 0.2
|
18
|
+
Cebolla 1.3 5.8 0.3
|
19
|
+
Calabaza 1.1 4.8 0.1
|
20
|
+
Manzana 0.3 12.4 0.4
|
21
|
+
Plátano 1.2 21.4 0.2
|
22
|
+
Pera 0.5 12.7 0.3
|
@@ -0,0 +1,8 @@
|
|
1
|
+
1 comp. manzana 0.0 0.0 0.0 6.7 6.5 6.8 6.9 7.0 7.1 6.9 6.9 6.9 6.7 6.9 7.3 7.0 7.0 7.2 7.1 6.8 7.2 7.3 7.0 6.8 6.7 6.8 6.7 6.9
|
2
|
+
1 yogurt 0.0 4.9 3.8 6.1 6.6 6.3 6.3 6.1 6.9 6.8 6.5 6.4 6.9 6.8 6.5 6.3 6.2 6.7 6.2 5.9 5.8 5.8 5.8 5.8 5.8 5.9 6.2 6.4
|
3
|
+
1 chocolate 5.3 47.0 30.0 6.5 6.5 6.7 6.5 6.5 6.8 6.7 6.2 6.5 7.2 6.9 7.0 6.3 6.2 6.1 5.9 5.8 6.1 6.7 6.7 6.6 6.7 6.9 7.2 7.1
|
4
|
+
1 glucosa 0.0 10.0 0.0 4.9 5.3 5.9 6.7 7.2 7.6 8.0 8.2 8.2 8.4 8.3 8.3 8.0 7.5 7.1 6.8 6.8 6.9 6.8 6.3 6.2 6.3 6.2 6.3 6.1
|
5
|
+
2 comp. manzana 0.0 0.0 0.0 4.6 4.8 5.3 5.6 6.1 6.5 6.6 7.0 7.0 6.8 6.4 6.3 6.1 6.1 6.2 6.0 6.1 6.1 6.2 6.3 6.4 6.1 6.1 5.7 5.9
|
6
|
+
2 yogurt 0.0 4.9 3.8 4.9 4.9 5.2 5.8 6.5 7.0 7.2 7.3 7.3 6.6 6.2 6.1 6.0 6.1 5.9 5.9 5.9 5.9 5.8 5.8 5.5 5.5 5.6 5.9 5.9
|
7
|
+
2 chocolate 0.0 4.9 3.8 4.6 4.6 4.7 4.7 4.8 4.7 4.8 4.8 4.6 4.4 4.7 4.7 4.8 4.7 5.2 5.9 5.9 5.7 5.4 5.3 5.1 4.8 4.8 4.9 5.9
|
8
|
+
2 glucosa 0.0 10.0 0.0 6.3 5.4 5.6 5.7 6.5 7.4 7.9 7.4 7.7 7.9 7.9 7.8 7.8 7.8 8.0 8.5 9.4 10.8 10.5 9.1 8.9 8.3 7.7 7.6 7.5
|
@@ -0,0 +1,22 @@
|
|
1
|
+
Huevo frito 14.1 0.0 19.5 Huevos, lácteos y helados
|
2
|
+
Leche vaca 3.3 4.8 3.2 Huevos, lácteos y helados
|
3
|
+
Yogurt 3.8 4.9 3.8 Huevos, lácteos y helados
|
4
|
+
Cerdo 21.5 0.0 6.3 Carnes y derivados
|
5
|
+
Ternera 21.1 0.0 3.1 Carnes y derivados
|
6
|
+
Pollo 20.6 0.0 5.6 Carnes y derivados
|
7
|
+
Bacalao 17.7 0.0 0.4 Pescados y mariscos
|
8
|
+
Atún 21.5 0.0 15.5 Pescados y mariscos
|
9
|
+
Salmón 19.9 0.0 13.6 Pescados y mariscos
|
10
|
+
Aceite de oliva 0.0 0.2 99.6 Alimentos grasos
|
11
|
+
Mantequilla 0.7 0.0 83.2 Alimentos grasos
|
12
|
+
Chocolate 5.3 47.0 30.0 Alimentos grasos
|
13
|
+
Azúcar 0.0 99.8 0.0 Alimentos ricos en carbohidratos
|
14
|
+
Arroz 6.8 77.7 0.6 Alimentos ricos en carbohidratos
|
15
|
+
Lentejas 23.5 52.0 1.4 Alimentos ricos en carbohidratos
|
16
|
+
Papas 2.0 15.4 0.1 Alimentos ricos en carbohidratos
|
17
|
+
Tomate 1.0 3.5 0.2 Verduras y Hortalizas
|
18
|
+
Cebolla 1.3 5.8 0.3 Verduras y Hortalizas
|
19
|
+
Calabaza 1.1 4.8 0.1 Verduras y Hortalizas
|
20
|
+
Manzana 0.3 12.4 0.4 Frutas
|
21
|
+
Plátanos 1.2 21.4 0.2 Frutas
|
22
|
+
Pera 0.5 12.7 0.3 Frutas
|
@@ -0,0 +1,55 @@
|
|
1
|
+
|
2
|
+
require 'nutritional_calculator/food'
|
3
|
+
require 'nutritional_calculator/linkedlist'
|
4
|
+
require 'nutritional_calculator/foodgroup'
|
5
|
+
require 'nutritional_calculator/sort_methods'
|
6
|
+
require 'nutritional_calculator/plate'
|
7
|
+
|
8
|
+
# encoding: utf-8
|
9
|
+
# El módulo se crea para describir los distintos elementos
|
10
|
+
# que compondrán una calculadora nutricional de alimentos.
|
11
|
+
# Author:: Cristian Abrante (mailto: alu0100945850@ull.edu.es)
|
12
|
+
# Copyright:: Creative Commons
|
13
|
+
# License:: Distributed under the same license as Ruby.
|
14
|
+
|
15
|
+
module NutritionalCalculator
|
16
|
+
|
17
|
+
# Método que lee la configuración del fichero y devuelve un vector de los alimentos.
|
18
|
+
|
19
|
+
def self.get_food_vector(file_name)
|
20
|
+
|
21
|
+
food_vector = Array.new
|
22
|
+
|
23
|
+
File.open(file_name, "r") do |file|
|
24
|
+
file.each_line do |line|
|
25
|
+
|
26
|
+
check_food_name = true
|
27
|
+
nutritional_values = Array.new
|
28
|
+
food_name = ""
|
29
|
+
food_group = ""
|
30
|
+
|
31
|
+
line.split(" ").each_with_index do |element, i|
|
32
|
+
if element.to_f == 0.0 and element != "#{element.to_f}"
|
33
|
+
if check_food_name
|
34
|
+
food_name += element + " "
|
35
|
+
else
|
36
|
+
food_group += element + " "
|
37
|
+
end
|
38
|
+
else
|
39
|
+
check_food_name = false
|
40
|
+
nutritional_values.push(element.to_f)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
if food_group.empty?
|
45
|
+
food_vector.push(NutritionalCalculator::Food.new(food_name.chop, nutritional_values[0], nutritional_values[1], nutritional_values[2]))
|
46
|
+
else
|
47
|
+
food_vector.push(NutritionalCalculator::FoodGroup.new(food_name.chop, nutritional_values[0], nutritional_values[1], nutritional_values[2], food_group.chop))
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
52
|
+
food_vector
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
|
2
|
+
module NutritionalCalculator
|
3
|
+
|
4
|
+
# Esta clase representa a un alimento de manera abstracta.
|
5
|
+
# Contiene su nombre y su información nutricional.
|
6
|
+
# Se ha incluido el módulo Comparable.
|
7
|
+
|
8
|
+
class Food
|
9
|
+
|
10
|
+
# valor nutricional de las proteinas: <b>4.0</b>
|
11
|
+
PROTEINS_VALUE = 4.0
|
12
|
+
|
13
|
+
# Valor nutricional de los glúcidos: <b>4.0</b>
|
14
|
+
CARBOHYDRATE_VALUE = 4.0
|
15
|
+
|
16
|
+
# Valor nutricional de los lípidos: <b>9.0</b>
|
17
|
+
LIPIDS_VALUE = 9.0
|
18
|
+
|
19
|
+
attr_reader :name, :proteins, :carbohydrates, :lipids, :glucose_concentration
|
20
|
+
include Comparable
|
21
|
+
|
22
|
+
# Constructor.
|
23
|
+
# @param name [String] Nombre del alimento que queremos representar.
|
24
|
+
# @param proteins [float] Gramos de proteína que contiene el alimanto.
|
25
|
+
# @param carbohydrates [float] Gramos de glúcidos que contiene el alimanto.
|
26
|
+
# @param lipids [float] Gramos de lípidos que contiene el alimanto.
|
27
|
+
# @param glucose_concentration[Array[Array[float]]] listas de concentraciones de glucosa tras la ingesta del alimento para varios individuos.
|
28
|
+
# @param glucose[Food] objeto glucosa de la clase Food, necesario para hacer los cálculos. Si el valor es nulo entonces es el objeto glucosa.
|
29
|
+
|
30
|
+
def initialize(name, proteins, carbohydrates, lipids, glucose_concentration = nil, glucose = nil)
|
31
|
+
@name = name
|
32
|
+
@proteins = proteins
|
33
|
+
@carbohydrates = carbohydrates
|
34
|
+
@lipids = lipids
|
35
|
+
@glucose_concentration = glucose_concentration
|
36
|
+
@glucose = glucose
|
37
|
+
end
|
38
|
+
|
39
|
+
# Método que transforma el objeto en un String.
|
40
|
+
# De esta forma será formateado por pantalla.
|
41
|
+
# @return [String] String con el objeto formateado.
|
42
|
+
|
43
|
+
def to_s
|
44
|
+
"#{@name} -> proteínas(#{@proteins}) glúcidos(#{@carbohydrates}) lípidos(#{@lipids})"
|
45
|
+
end
|
46
|
+
|
47
|
+
# Método que devuelve el valor nutricional del alimento.
|
48
|
+
# El valor nutricional se calcula como la suma del producto
|
49
|
+
# de los valores nutricionales de los macronutrientes por los gramos
|
50
|
+
# de dicho macronutriente presente en el alimento.
|
51
|
+
# @return [float] Valor nutricional del alimento
|
52
|
+
|
53
|
+
def get_nutritional_value
|
54
|
+
@proteins * PROTEINS_VALUE + @carbohydrates * CARBOHYDRATE_VALUE + @lipids * LIPIDS_VALUE
|
55
|
+
end
|
56
|
+
|
57
|
+
# Método que permite hacer al alimento Comparable.
|
58
|
+
# En mi caso el criterio de comparación ha sido el valor
|
59
|
+
# nutricional del alimento.
|
60
|
+
# @param other [NutritionalCalculator::Food] alimento con el cual queremos comparar el alimento.
|
61
|
+
|
62
|
+
def <=> (other)
|
63
|
+
get_nutritional_value <=> other.get_nutritional_value
|
64
|
+
end
|
65
|
+
|
66
|
+
# Método que permite calcular el área incremental bajo la curva de las mediciones de glucosa de un alimento.
|
67
|
+
# Se ha realizado mediante programación funcional.
|
68
|
+
# @param individual [int] Individuo para el cual queremos calcular el AIBC del alimento.
|
69
|
+
|
70
|
+
def aibc(individual)
|
71
|
+
(1..24).lazy.map { |i| s_value(individual, i) }.map { |j| (5.0 / 2.0) * j }.reduce('+')
|
72
|
+
end
|
73
|
+
|
74
|
+
# Método que calcula el índice glucémico del alimento para un individuo concreto.
|
75
|
+
# Se ha realizado mediante programación funcional.
|
76
|
+
# @param individual [int] Individuo para el cual queremos calcular el índice glucémico del alimento.
|
77
|
+
|
78
|
+
def individual_glycemic_index(individual)
|
79
|
+
100.0 * (aibc(individual) / @glucose.aibc(individual))
|
80
|
+
end
|
81
|
+
|
82
|
+
# Método que calcula el índice glucémico del alimento, haciendo la media del índice glucémico para los individuos.
|
83
|
+
|
84
|
+
def glycemic_index
|
85
|
+
(0...@glucose_concentration.size).map { |i| individual_glycemic_index(i) }.instance_eval { reduce('+') / size.to_f}
|
86
|
+
end
|
87
|
+
|
88
|
+
def weight
|
89
|
+
@proteins + @carbohydrates + @lipids
|
90
|
+
end
|
91
|
+
|
92
|
+
private
|
93
|
+
def s_value(individual, i)
|
94
|
+
@glucose_concentration[individual][i] + @glucose_concentration[individual][i - 1] - 2 * @glucose_concentration[individual][0]
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
|
2
|
+
module NutritionalCalculator
|
3
|
+
|
4
|
+
# Clase concreta de un alimento
|
5
|
+
# Contiene además el grupo al que pertenece el alimento.
|
6
|
+
|
7
|
+
class FoodGroup < NutritionalCalculator::Food
|
8
|
+
|
9
|
+
attr_reader :group
|
10
|
+
|
11
|
+
# Constructor.
|
12
|
+
# @param name [String] Nombre del alimento que queremos representar.
|
13
|
+
# @param proteins [float] Gramos de proteína que contiene el alimanto.
|
14
|
+
# @param carbohydrates [float] Gramos de glúcidos que contiene el alimanto.
|
15
|
+
# @param lipids [float] Gramos de lípidos que contiene el alimanto.
|
16
|
+
# @param group [String] Nombre del grupo al que pertenece el alimento.
|
17
|
+
|
18
|
+
def initialize(name, proteins, carbohydrates, lipids, group)
|
19
|
+
@group = group
|
20
|
+
super(name, proteins, carbohydrates, lipids, [[]])
|
21
|
+
end
|
22
|
+
|
23
|
+
# Método que transforma el objeto en un String.
|
24
|
+
# De esta forma será formateado por pantalla.
|
25
|
+
# @return [String] String con el objeto formateado.
|
26
|
+
|
27
|
+
def to_s
|
28
|
+
super.to_s + " grupo(#{@group})"
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,194 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module NutritionalCalculator
|
4
|
+
|
5
|
+
# Clase que representa a una lista doblemente enlazada.
|
6
|
+
|
7
|
+
class LinkedList
|
8
|
+
|
9
|
+
include Enumerable;
|
10
|
+
|
11
|
+
# Estructura que representa a un nodo de la lista enlazada.
|
12
|
+
Node = Struct.new(:value, :next, :prev)
|
13
|
+
|
14
|
+
# Constructor que inicializa una lista vacía.
|
15
|
+
def initialize
|
16
|
+
|
17
|
+
# Atribute that represents the head
|
18
|
+
# of the list.
|
19
|
+
@head = nil
|
20
|
+
|
21
|
+
# Atribute that represents the tail
|
22
|
+
# of the list.
|
23
|
+
@tail = nil
|
24
|
+
end
|
25
|
+
|
26
|
+
# -- ISERTION METHODS
|
27
|
+
|
28
|
+
# Método que inseta un valor por la parte posterior de la lista.
|
29
|
+
# @param value [value] Valor que queremos insertar.
|
30
|
+
|
31
|
+
def push_back(value)
|
32
|
+
if @head == nil
|
33
|
+
@head = Node.new(value, nil, nil)
|
34
|
+
@tail = @head
|
35
|
+
else
|
36
|
+
current_node = Node.new(value, nil, @tail)
|
37
|
+
@tail.next = current_node
|
38
|
+
@tail = current_node
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# Método que inseta un valor por la parte delantera de la lista.
|
43
|
+
# @param value [value] Valor que queremos insertar.
|
44
|
+
|
45
|
+
def push_front(value)
|
46
|
+
if @head == nil
|
47
|
+
@head = Node.new(value, nil, nil)
|
48
|
+
@tail = @head
|
49
|
+
else
|
50
|
+
current_node = Node.new(value, @head, nil)
|
51
|
+
@head.prev = current_node
|
52
|
+
@head = current_node
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# Método que inserta un conjunto de valores por la parte posterior de la lista.
|
57
|
+
# @param values [value] conjunto de elementos que queremos insertar en la lista.
|
58
|
+
|
59
|
+
def insert(*values)
|
60
|
+
values.each do |value|
|
61
|
+
push_back(value)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# -- EXTRACTION METHODS
|
66
|
+
|
67
|
+
# Método que extrae el último elemento posterior de la lista
|
68
|
+
|
69
|
+
def pop_back
|
70
|
+
if @head == @tail
|
71
|
+
@head = @tail = nil
|
72
|
+
else
|
73
|
+
if @tail
|
74
|
+
@tail = @tail.prev
|
75
|
+
@tail.next = nil;
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# Método que extrae el primer elemento de la lista.
|
81
|
+
|
82
|
+
def pop_front
|
83
|
+
if @head == @tail
|
84
|
+
@head = @tail = nil
|
85
|
+
else
|
86
|
+
if @head
|
87
|
+
@head = @head.next
|
88
|
+
@head.prev = nil;
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
# Método que busca la primera ocurrencia de un elemento en la lista
|
94
|
+
# y lo elimina.
|
95
|
+
# @param value [value] [value] Valor que pretendemos eliminar.
|
96
|
+
|
97
|
+
def erase(value)
|
98
|
+
|
99
|
+
if @head and @head.value == value
|
100
|
+
pop_front
|
101
|
+
elsif @tail and @tail.value == value
|
102
|
+
pop_back
|
103
|
+
else
|
104
|
+
|
105
|
+
current_node = @head
|
106
|
+
while current_node
|
107
|
+
|
108
|
+
if current_node.value == value
|
109
|
+
current_node.prev.next = current_node.next
|
110
|
+
current_node.next.prev = current_node.prev
|
111
|
+
end
|
112
|
+
|
113
|
+
current_node = current_node.next
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
# -- ACCESS METHODS
|
120
|
+
|
121
|
+
# Método que accede al valor del primer elemento de la lista.
|
122
|
+
# @return [value, nil] Primer elemento de la lista.
|
123
|
+
|
124
|
+
def front
|
125
|
+
if @head
|
126
|
+
@head.value
|
127
|
+
else
|
128
|
+
nil
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
# Método que accede al último elemento de la lista.
|
133
|
+
# @return [value, nil] Último elemento de la lista.
|
134
|
+
|
135
|
+
def back
|
136
|
+
if @tail
|
137
|
+
@tail.value
|
138
|
+
else
|
139
|
+
nil
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
# Método que accede a un elemento dada su posición en la lista.
|
144
|
+
# @param pos [number] Posición del elemento en la lista.
|
145
|
+
# @return [value,nil] Elemento que se encuentra en la posición pos.
|
146
|
+
|
147
|
+
def [] (pos)
|
148
|
+
|
149
|
+
current_node = @head
|
150
|
+
i = 0
|
151
|
+
while current_node and i != pos
|
152
|
+
current_node = current_node.next
|
153
|
+
i += 1
|
154
|
+
end
|
155
|
+
if current_node
|
156
|
+
current_node.value
|
157
|
+
else
|
158
|
+
nil
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
# Método que pasa a cada elemento de la lista un bloque para que se ejecute.
|
163
|
+
|
164
|
+
def each
|
165
|
+
current_node = @head
|
166
|
+
while current_node
|
167
|
+
yield current_node.value
|
168
|
+
current_node = current_node.next
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
# Método que transforma el objeto en un String.
|
173
|
+
# De esta forma será formateado por pantalla.
|
174
|
+
# @return [String] String con el objeto formateado.
|
175
|
+
|
176
|
+
def to_s
|
177
|
+
list_as_string = ""
|
178
|
+
|
179
|
+
current_node = @head
|
180
|
+
while current_node
|
181
|
+
list_as_string += "#{current_node.value}"
|
182
|
+
|
183
|
+
if current_node.next
|
184
|
+
list_as_string += " <-- "
|
185
|
+
end
|
186
|
+
|
187
|
+
current_node = current_node.next
|
188
|
+
end
|
189
|
+
|
190
|
+
list_as_string
|
191
|
+
end
|
192
|
+
|
193
|
+
end
|
194
|
+
end
|