Class: List

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/InformacionNutricional/list.rb

Overview

Esta clase implementa una lista doblemente enlazada Se ha incluido el mixin Enumerable

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeList

Creamos una lista vacía



18
19
20
21
# File 'lib/InformacionNutricional/list.rb', line 18

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

Instance Attribute Details

#headObject (readonly)

Getters de las variables de instancia



15
16
17
# File 'lib/InformacionNutricional/list.rb', line 15

def head
  @head
end

#sizeObject (readonly)

Getters de las variables de instancia



15
16
17
# File 'lib/InformacionNutricional/list.rb', line 15

def size
  @size
end

#tailObject (readonly)

Getters de las variables de instancia



15
16
17
# File 'lib/InformacionNutricional/list.rb', line 15

def tail
  @tail
end

Instance Method Details

#eachObject

Se incluye el método del mixin Enumerable Se define como una iteración c/u de los calores de los nodos



134
135
136
137
138
139
140
141
# File 'lib/InformacionNutricional/list.rb', line 134

def each
    aux = @head
    sz = @size
    for i in (1..sz)
        yield aux.value
        aux = aux.next
    end
end

#insert_head(node) ⇒ Object

Método para insertar un nodo por la cabeza



35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/InformacionNutricional/list.rb', line 35

def insert_head(node)
    if is_empty
        new_node = Node.new(node,nil,nil)
        @head = new_node
        @tail = @head
    else
        new_node = Node.new(node,@head,nil)
        @head.prev = new_node
        @head = new_node
    end
    @size = @size + 1
end

#insert_n_to_head(array) ⇒ Object

Método para insertar varios nodos por la cabeza



63
64
65
66
67
# File 'lib/InformacionNutricional/list.rb', line 63

def insert_n_to_head(array)
    array.each do |node|
        insert_head(node)
    end
end

#insert_n_to_tail(array) ⇒ Object

Método para insertar varios nodos por la cola



70
71
72
73
74
# File 'lib/InformacionNutricional/list.rb', line 70

def insert_n_to_tail(array)
    array.each do |node|
        insert_tail(node)
    end
end

#insert_tail(node) ⇒ Object

Método para insertar un nodo por la cola



49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/InformacionNutricional/list.rb', line 49

def insert_tail(node)
    if is_empty
        new_node = Node.new(node,nil,nil)
        @tail = new_node
        @head = @tail
    else
        new_node = Node.new(node,nil,@tail)
        @tail.next = new_node
        @tail = new_node
    end
    @size = @size + 1
end

#is_emptyObject

Comprueba si la lista está vacía



24
25
26
27
28
29
30
31
32
# File 'lib/InformacionNutricional/list.rb', line 24

def is_empty
    empty = ""
    if (@head == nil)
        empty = true
    else
        empty = false
    end
    empty
end

#remove_headObject

Método para eliminar la cabeza



77
78
79
80
81
82
83
84
85
86
# File 'lib/InformacionNutricional/list.rb', line 77

def remove_head
    if @size == 1
        @head = nil
        @tail = @head
    else
        @head = @head.next
        @head.prev = nil
    end
    @size = @size - 1
end

#remove_n_from_head(qty) ⇒ Object

Método para eliminar varios nodos por la cabeza



101
102
103
104
105
106
107
# File 'lib/InformacionNutricional/list.rb', line 101

def remove_n_from_head(qty)
    times = 0
    while times < qty && @size > 0
        remove_head
        times = times + 1
    end
end

#remove_n_from_tail(qty) ⇒ Object

Método para eliminar varios nodos por la cola



110
111
112
113
114
115
116
# File 'lib/InformacionNutricional/list.rb', line 110

def remove_n_from_tail(qty)
    times = 0
    while times < qty && @size > 0
        remove_tail
        times = times + 1
    end
end

#remove_tailObject

Método para eliminar la cola



89
90
91
92
93
94
95
96
97
98
# File 'lib/InformacionNutricional/list.rb', line 89

def remove_tail
    if @size == 1
        @tail = nil
        @head = @tail
    else
        @tail = @tail.prev
        @tail.next = nil
    end
    @size = @size - 1
end

#sort_eachObject

Oredena la lista con each



163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
# File 'lib/InformacionNutricional/list.rb', line 163

def sort_each
    sorted = [@head.value]
    self.each_with_index do |x, pos_x|
        if (pos_x != 0)
            sorted.each_with_index do |y, pos_y|
                if (pos_y == sorted.size - 1)
                    if (x < y)
                        sorted.insert(pos_y, x)
                        break
                    else
                        sorted.push(x)
                        break
                    end
                elsif (x < y)
                    sorted.insert(pos_y, x)
                    break
                end
            end
        end
    end
    return sorted
end

#sort_forObject

Ordena la lista con for



144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# File 'lib/InformacionNutricional/list.rb', line 144

def sort_for
    sorted = [@head.value]
    aux = @head
    sz = @size
    for i in (1...sz)
        aux = aux.next
        for j in (0..sorted.size)
            if (j == sorted.size)
                sorted.push(aux.value)
            elsif (aux.value < sorted[j])
                sorted.insert(j, aux.value)
                break
            end
        end
    end
    return sorted
end

#to_sObject

Override del to_s



119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/InformacionNutricional/list.rb', line 119

def to_s
    array = ""
    node = @head
    while node != nil
        array += "#{node.value.name}"
        if node.next != nil
            array += ", "
        end
        node = node.next
    end
    array
end