nutritional_calculator 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|