ARRAY DINÁMICO Fundamentos de programación
Equipo #2: -
Romario Romario Aguirre Aguirre Alonso Alonso Dolores Dolores Arlett Arlett Antele Antele Temich Juan Juan José José e!a e!a "ernn "ernnde$ de$ Juan arlos arlos hapol hapol %onciano %onciano &ictor &ictor "ugo hi!am!a hi!am!a hipol hipol Diana 'aura hipol hipol Temich (arahi (arahi de )ilagros )ilagros o!a Acua 'uis 'uis Angel Angel o!i* o!i* +rineo +rineo ,a!rie ,a!riela la ru$ ru$ (nche (nche$ $ +melda +melda Joceln Joceln ,arc.a ,arc.a hipol hipol 'uis Enrique Enrique )achucho )achucho orte$ orte$ esar /oel )achucho )achucho 0lgu.n 0lgu.n 'uis 'uis Al!ert Al!erto o )u1o$ )u1o$ olo olo Armando Armando %ére$ %ére$ Dom.ngue$ Dom.ngue$ Denisse Denisse Ram.re$ Ram.re$ /a3arrete /a3arrete /inger /inger &alencia alencia ardo$a ardo$a
Arra Dinmico
Índice Introducción5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555 2 Definición de un array dinámico 555555555555555555555555555555555555555555555555555555555555555555555555555555555556 Vector 5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555 7 Declaración e inicialización de una variable vector 555555555555555555555555555555555555555555555555555557 Capacidad de un vector 5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555557 Declarar, redimensionar y trabajar con arrays dinámicos 5555555555555555555555555555555555555555555558 Añadir, eliminar y consultar elementos de un vector 5555555555555555555555555555555555555555555555555559
Arraylist5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555 Declaración y creación de un arraylist 55555555555555555555555555555555555555555555555555555555555555555555555 Copiar un arraylist 5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555; Recorrer un arraylist5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555554< Métodos de arraylist 555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555 4< Arraylist como parámetro de un método55555555555555555555555555555555555555555555555555555555555555555544 Rendimiento y comparación con otras estructuras 555555555555555555555555555555555555555555555555555542 Bucles or eac! 55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555546
Conclusión5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555 48
4
Arra Dinmico
Introducción "n arre#lo en $ava es un #rupo de posiciones de memoria conti#uas, todas las cuales tienen el mismo nombre y el mismo tipo% &s una estructura de datos 'ue permite almacenar un conjunto de datos de un mismo tipo% &l tamaño de los arrays se declara en un primer momento y no puede cambiar lue#o durante la ejecución del pro#rama, como s( puede !acerse en otros len#uajes% )os arre#los en $ava son dinámicos, pero no e*tensibles, lo cual si#niica 'ue deben ser creados con el tamaño 'ue tendrán !asta el inal de su vida para declarar, por ejemplo, un arre#lo de n+meros enteros utilizaremos la si#uiente sentencia int-. arrint/ 0ara crear el arre#lo deberemos recurrir al operador ne1 arrint 2 ne1 int-34./ )a orma de declararlos es la si#uiente •
"nidimensionales
5ipo nombre6array-.2ne1 tipo-n./ 5ipo nombre6array-.27valores8/ •
Bidimensionales
5ipo nombre6array-.-.2ne1 tipo-n.-n./ 5ipo nombre6array-.-.27valores8/
2
Arra Dinmico
Definición de un array dinámico un array dinámico, es un arre#lo de elementos 'ue crece o men#ua dinámicamente conorme los elementos se a#re#an o se eliminan% 9e suministra como librer(as estándar en muc!os len#uajes modernos de pro#ramación% )a orma más sencilla de construir un arre#lo dinámico es la asi#nación de espacio de tamaño ijo dividido en dos partes la primera es la parte ocupada de del arre#lo y la se#unda está libre para su crecimiento% &l n+mero de elementos usados por el contenido del arre#lo dinámico es su tamaño ló#ico o simplemente tamaño, mientras 'ue el tamaño del arre#lo subyacente se denomina la capacidad dinámica, 'ue es el tamaño má*imo posible sin reubicación de datos% &n aplicaciones donde el tamaño ló#ico es conocido, las estructuras de tamaño ijo son las más eicientes, como es evidente, por lo 'ue es mejor usar en estos casos arre#los asi#nados dinámicamente, cuyo tamaño sea un parámetro de la ejecución, 'ue pueda aumentarse cuando se detecta 'ue se alcanzan los l(mites, optimizando el espacio ocupado%
6
Arra Dinmico
Vector "n objeto de tipo :ector contiene elementos 'ue pueden ser accedidos por un (ndice y puede aumentar o disminuir su tamaño dinámicamente en tiempo de ejecución%
Declaración e inicialización de una variable vector &n el si#uiente ejemplo podemos ver cómo se declara import java%util%:ector/ public class 0rueba7 public static void main;9trin#-. ar#s<7 :ector=9trin#>v2 ne1 :ector=9trin#>; v%add;?@ola rupo 34A? v%add;?9aludos%%%? v%add;?Bye%%%? 9ystem%out%println;?&lementos en v? v%size;< 9ystem%out%println;?En?v%elementAt;4<?En? v%elementAt;3< ?En?v%elementAt;F< 8 8 •
•
• •
•
Al estar implementada esta uncionalidad mediante una clase, la variable GvH se inicializa creando una instancia de la clase con la llamada a Ine1 vector; A continuación, se añaden elementos mediante llamadas al método add;< 5ambién podemos ver 'ue n+mero de elementos 'ue contiene el vector se obtiene con el método size;< 0or +ltimo, vemos 'ue para acceder a un elemento del vector se utiliza el método Ielementat;(ndice
Capacidad de un vector Cada vez 'ue se añade un elemento a un vector, el sistema tiene 'ue ubicar la memoria necesaria para alber#arlo% 0ara mejorar el rendimiento cuando se trabaja con
7
Arra Dinmico vectores 'ue deben contener un elevado n+mero de elementos, en al crear el objeto vector se puede deinir una capacidad inicial, y un incremento de capacidad del vector iKnt capacidadinicial 2 3444/ int capacidadincremento 2 344/ :ector v 2 ne1 :ector;capacidadinicial, capacidadincremento Además, disponemos de los si#uientes métodos relacionados con la capacidad del vector •
int capacity;< L devuelve la capacidad actual del vector ;siempre sera mayor o
•
i#ual a su tamaño actual< &nsurecapacity;int capacidad< L incrementa la capacidad del vector si es menor
•
'ue la 'ue se indica ;pero no la reduce si es mayor< trimtosize;< L reduce la capacidad del vector para 'ue coincida con el tamaño del vector
Declarar, redimensionar y trabajar con arrays dinámicos "n array dinámico !abrá de redimensionarse al menos una vez ;para poder ser usado<, pero podrá modiicarse tantas veces para declarar un array dinámico, simplemente declárelo sin indicar las dimensiones del mismo
Var Arraydinamico : array of string; //array dinámico de string
Antes de 'ue puede utilizar un array dinámico debe reserver la memoria para el mismo asi#nándole una dimensión //reserva espacio para 10 elementos Setlength (arraydinamico, 10); "na vez 'ue se !a reservado la memoria, puede acceder a los elementos del array como uno normal Arraydinamico0! :" #esto es $na pr$e%a#; &e'too%tenido :" arraydinamico0!; )os arrays dinámicos son #estionados durante su vida, por lo 'ue no es necesario 'ue los libere cuando acabe de utilizarlos, ya 'ue se liberarán cuando dejen el ámbito en el 'ue ueron creados% 9in embar#o, si en al#una ocasión necesita liberarlos ;por ejemplo
8
Arra Dinmico cuando utilizan #ran cantidad de memoria< lo +nico 'ue tiene 'ue !acer es asi#nar el array dinámico a ?nil? Arraydinamico :" nill; //li%era arraydinamico de memoria
Añadir, eliminar y consultar elementos de un vector Disponemos de los si#uientes métodos para alterar el contenido del vector • • •
• •
•
• •
add&lement;e< L añade un elemento al vector add ;id*, e<, insert&lementat;e, id*< L inserta el elemento en la posición indicada% set ;id*, e<, set&lementat;e, id*< L sustituye el elemento en el (ndice id* por el elemento GeH #et ;id*<, elementAt;id*< L devuelve el elemento en el (ndice id* del vector irst&lement;<, lastel&ment;< L devuelven respectivamente el primer y +ltimo elemento del vector remove ;id*<, remove&lementAt;id*< L devuelve el elemento en el (ndice id*, y lo elimina del vector% &l (ndice de los elementos posteriores disminuye en una unidad, de modo 'ue el elemento en la posición id*3 pasa a ser el nuevo elemento en la posición id* removeRan#e;id*3, id*F< L elimina los elementos con indices id*3 =2 id* = id*F contains; e < L devuelve true si el vector contiene el objeto GeH
9
Arra Dinmico
Arraylist &s una clase 'ue permite almacenar datos en memoria de orma similar a los Arrays, con la ventaja de 'ue el n+mero de elementos 'ue almacena, lo !ace de orma dinámica, es decir, 'ue no es necesario declarar su tamaño como pasa con los Arrays
Declaración y creación de un arraylist De orma #eneral un arraylist en java se crea de la si#uiente orma Arraylist nombrearray 2 ne1 arraylist; &sta instrucción crea el arraylist nom%rearray vac(o% "n arraylist declarado as( puede contener objetos de cual'uier tipo% 0or ejemplo import java%util%Array)ist/ public class 0rueba7 public static void main;9trin#-. ar#s<7 Array)ist v2 ne1 Array)ist; v%add;?len#uaje? v%add; v%add;NaN v%add;F%O 9ystem%out%println;?)os elementos del Array)ist son En? v%#et;4<?En? v%#et;3<?En?v%#et;F<?En? v%#et;< 8 8
&l primer objeto 'ue se añade es el strin# Ilen#uajeJ% &l resto no son objetos% 9on datos de tipos básicos pero el compilador los convierte automáticamente en objetos de su clase envolvente ;clase contenedora o 1rapper< antes de añadirlos al array%
Arra Dinmico "na alternativa a esta declaración es indicar el tipo de objetos 'ue contiene% &n este caso, el array solo podrá contener objetos de ese tipo% De orma #eneral Arraylist=tipo> nombrearray 2 ne1 arraylist=tipo>; 5ipo debe ser una clase% Kndica el tipo de objetos 'ue contendrá el array% Po se pueden usar tipos primitivos% 0ara un tipo primitivo se debe utilizar su clase envolvente% •
Arraylist;< construye un arraylist con capacidad cero por deecto, pero crecerá se#+n le vayamos añadiendo Arraylist al 2 ne1 arraylist; •
Arraylist;int capacidadinicial< construye un arraylist vac(o con una capacidad inicial especiicada Arraylist alF 2 ne1 arraylist;O 0ara insertar un objeto al arraylist debemos llamar a sus métodos con el operador punto al%add;?el manual de java?
QQ añade una cadena
al%add;ne1 double;4%44< clase envoltorio ;1rapper class<
QQ añade un dato de tipo double de una
9ystem%out%println;al%size;< QQ presenta el tamaño del arre#lo
0ara nave#ar por los elementos del arraylist se utiliza la clase iterator y sus métodos !asne*t y ne*t Kterator alit 2 al%iterator; !ile ;alit%!asne*t;<< 7 9ystem%out%println;alit%ne*t;< ? ? 8
=
Arra Dinmico Copiar un arraylist &l nombre de un arraylist contiene la reerencia al arraylist, es decir, la dirección de memoria donde se encuentra el arraylist, i#ual 'ue sucede con los arrays estáticos% 9i disponemos de un arraylist de enteros llamado ventas
la instrucción Arraylist=inte#er> ventas3 2 ventas/ Po copia el array ventas en el nuevo array ventas3 sino 'ue crea un alias
De esta orma tenemos dos ormas de acceder al mismo arraylist mediante la reerencia ventas y mediante la reerencia ventas3% 0ara !acer una copia podemos !acerlo de orma manual elemento a elemento o se puede pasar la reerencia del arraylist ori#inal al constructor del nuevo Arraylist=inte#er> ventas3 2 ne1 arraylist=inte#er>;ventas
;
Arra Dinmico
Recorrer un arraylist 0odemos recorrerlo de orma clásica con un bucle or Sor;int i 2 4/i=array%size;
Métodos de arraylist Al#unos métodos 'ue proporciona arraylist son Método
Descripción
9ize;<
Devuelve el n+mero de elementos ;int<
Add;*<
Añade el objeto * al inal% Devuelve true%
Add;posición, *<
Knserta el objeto * en la posición indicada%
et;posicion< Remove;posicion<
Devuelve el elemento 'ue está en la posición indicada% &limina el elemento 'ue se encuentra en la
4<
Arra Dinmico posición indicada% Devuelve el elemento eliminado% Remove;*<
&limina la primera ocurrencia del Devuelve true si el elemento está en la lista%
Clear;<
objeto
*%
&limina todos los elementos%
9et;posición, *<
9ustituye el elemento 'ue se encuentra en la posición indicada por el objeto *% Devuelve el elemento sustituido%
Contains;*<
Comprueba si la colección contiene al objeto *% Devuelve true o alse%
Knde*o;*<
Devuelve la posición del objeto *% 9i no e*iste devuelve 3
Arraylist como parámetro de un método
"n arraylist puede ser usado como parámetro de un método% Además un método puede devolver un arraylist mediante la sentencia return% E>emplo: método que reci!e un arralist de string lo modi?ca in3irtiendo su contenido: Kmport java%util%T/ 0ublic class arraylist 7 0ublic static void main;strin#-. ar#s< 7 Arraylist=strin#> nombres 2 ne1 arraylist=strin#>;
Pombres%add;?ana?
Pombres%add;?luisa?
Pombres%add;?elipe?
Pombres%add;?pablo?
9ystem%out%println;nombres Pombres 2 invertir;nombres
9ystem%out%println;nombres 8
44
Arra Dinmico 0ublic static arraylist=strin#> invertir;arraylist=strin#> nombres< 7 QQ crea una lista para el resultado del método Arraylist=strin#> resultado 2 ne1 arraylist=strin#>; QQ recorre la lista de nombres en orden inverso Sor ;int i 2 nombres%size;< 3/ i >2 4/ i< 7 QQ añade cada nombre al resultado
Resultado%add;nombres%#et;i< 8 Return resultado/ 8
8
Rendimiento y comparación con otras estructuras )os arre#los dinámicos tienen un rendimiento similar a un arre#lo estático, con la adición de nuevas operaciones para añadir y eliminar elementos al inal •
•
•
•
•
Al obtener o establecer el valor de un (ndice en particular U;3< ;tiempo constante< Recorrer sus elementos en orden U;n< ;tiempo lineal, buen uso del cac!é de lectura< Knsertar o eliminar un elemento no al inal del arre#lo U; n< ;tiempo lineal< Knsertar o eliminar constante amortizado<
un
elemento
al
inal
del
arre#lo
U;3<
;tiempo
&spacio desperdiciado U;n
)os arre#los dinámicos se beneician de muc!as de las ventajas de los arre#los estáticos, incluido buena localización por reerencia y uso de cac!é de datos, tamaño reducido ;bajo uso de memoria< y capacidad de acceso aleatorio% 0or lo #eneral tienen solo una pe'ueña sobrecar#a ija adicional para almacenar inormación sobre tamaño y capacidad% &sto !ace de los are#los dinámicos una !erramienta atractiva para la construcción de estructuras de datos ami#ables y sencillas de usar%
42
Arra Dinmico Bucles or eac! "na nueva orma de usar el or, a la 'ue se denomina Ior e*tendidoJ o Ior eac!J% &sta orma de uso del or, 'ue ya e*ist(a en otros len#uajes, acilita el recorrido de objetos e*istentes en una colección sin necesidad de deinir el n+mero de elementos a recorrer% )a sinta*is 'ue se emplea es or ; 5ipoARecorrer nombre:ariable5emporal nombreDe)aColección < 7 Knstrucciones 8 &l ciclo oreac! es una !erramienta muy +til cuando tenemos 'ue realizar recorridos completos de colecciones, por lo 'ue lo usaremos en numerosas ocasiones antes 'ue ciclos or o 1!ile 'ue nos obli#an a estar pendientes de más cuestiones ;por ejemplo en este caso con el 1!ile, de llevar un contador, llamar en cada iteración a un método, etc%<% "n or e*tendido en principio recorre todos y cada uno de los elementos de una colección% 9in embar#o, podemos introducir un condicional asociado a una sentencia breaV/ 'ue aborte el recorrido una vez se cumpla una determinada condición% &jemplo import java%util%T/ import java%io%T/ public class Array)istF 7 public static void main;9trin#-. ar#s< 7 9canner sc 2 ne1 9canner;9ystem%in Array)ist=Knte#er> numeros 2 ne1 Array)ist=Knte#er>; int n/ do 7 9ystem%out%println;?Kntroduce n+meros enteros% 4 para acabar ? 9ystem%out%println;?Pumero ? n 2 sc%ne*tKnt; i ;n W2 4< numeros%add;n 81!ile ;n W2 4 9ystem%out%println;?@a introducido ? numeros%size;< ? n+meros?
QQmostrar el array)ist completo 9ystem%out%println;numeros QQrecorrido usando un iterador para mostrar un elemento por l(nea Kterator it 2 numeros%iterator; 46
Arra Dinmico
1!ile;it%!asPe*t;<< 9ystem%out%println;it%ne*t;< QQrecorrido usando oreac! para sumar los elementos double suma 2 4/ or;Knte#er i numeros<7 suma 2 suma i/ 8 9ystem%out%println;?9uma ? suma 9ystem%out%println;?Media ? sumaQnumeros%size;< 8
8
47
Arra Dinmico
Conclusión @emos lle#ado a la conclusión 'ue los array ;arre#los< dinámico como a'uel 'ue es declarado con un n+mero de elementos componente indeinido% Dic!a indeinición se !ace constar, al declarar el array en cabecera de módulo o pro#rama, dejando los paréntesis vac(os, los arre#los pueden variar dependiendo sus dimensiones% &stos pueden ser unidimensionales y bidimensionales/ a los primeros se les conoce como vectores y como su nombre lo indica poseen una dimensión o una lista de datos del mismo tipo y los bidimensionales poseen dos dimensiones/ se usan para representar datos 'ue pueden verse como una tabla con ilas y columnas y se les conoce como matrices% )a codiicación es al#o tan simple como lo 'ue realizamos a diario cuando transormamos imá#enes visuales o entidades conceptuales en palabras, oraciones, te*tos y las comunicamos a a'uellos 'ue nos rodean% Conocemos a la codiicación como cual'uier operación 'ue impli'ue la asi#nación de un valor de s(mbolos o caracteres a un determinado mensaje verbal con el propósito de transmitirlo a otros individuos o entidades 'ue compartan el códi#o%
48