JAVA. UD5: Estructuras de almacenamiento. Vectores.

Page 1

UD 5: Estructuras de almacenamiento. Arrays ó Vectores.

Profesor: Néstor Martínez


Índice 1. 2. 3. 4. 5. 6. 7. 8.

Definición, declaración y creación de arrays. Vectores multidimensionales ó matrices. Algoritmos de ordenación. Problemas de recorrido y búsqueda en vectores. Cadenas de caracteres. Cadenas de caracteres. La clase String. Cadenas de caracteres. La clase StringBuffer. Vectores de objetos String.


1. Definición, declaración y creación de arrays.  También se les conoce como Vectores o Arreglos.  Debido a la existencia de la clase Vector de Java, que se

parece a un array, pero con ciertas diferencias, usaremos en esta unidad el termino inglés array, para evitar confusiones o inconsistencias.  Se pueden definir un array como un tipo de variable que puede guardar muchos valores a la vez.  Una variable solo puede guardar un único valor a la vez: los arrays pueden almacenar muchos valores a la vez.


1. Definiciรณn, declaraciรณn y creaciรณn de arrays.


1. Definición, declaración y creación de arrays.  Un array llamado ‘v’ de 8 enteros se podría dibujar así:

 Podemos decir que:     

v es el nombre del array. Este array contiene 8 valores. En negrita están los valores que contiene el array. Los números de abajo son los índices (ó posición) del array. Los índices son números naturales empezando siempre en cero. Los índices se indican entre corchetes.


1. Definiciรณn, declaraciรณn y creaciรณn de arrays.


1. Definiciรณn, declaraciรณn y creaciรณn de arrays.


1. Definiciรณn, declaraciรณn y creaciรณn de arrays.


1. Definiciรณn, declaraciรณn y creaciรณn de arrays.


1. Definiciรณn, declaraciรณn y creaciรณn de arrays.


1. Definiciรณn, declaraciรณn y creaciรณn de arrays.


1. Definiciรณn, declaraciรณn y creaciรณn de arrays.


1. Definición, declaración y creación de arrays.

Se inicializa a su valor por defecto. En el caso de los enteros, valdrá cero, en el caso de los String "", en el caso de los char valdrá ‘’, etcétera…


1. Definiciรณn, declaraciรณn y creaciรณn de arrays.

โ ข "" en el caso de String


1. Definiciรณn, declaraciรณn y creaciรณn de arrays.


1. Definiciรณn, declaraciรณn y creaciรณn de arrays.


1. Definiciรณn, declaraciรณn y creaciรณn de arrays.


1. Definiciรณn, declaraciรณn y creaciรณn de arrays.


1. Definiciรณn, declaraciรณn y creaciรณn de arrays.


1. Definiciรณn, declaraciรณn y creaciรณn de arrays.


1. Definiciรณn, declaraciรณn y creaciรณn de arrays.


1. Definición, declaración y creación de arrays.  Métodos de los vectores: Java maneja los vectores como si fueran objetos, por lo tanto existen una serie de métodos de la clase Object que está en el paquete java.lang:  equals: Permite discernir si dos referencias son el mismo objeto.  clone: Duplica un objeto.


1. Definición, declaración y creación de arrays.  Métodos de los vectores. Ejemplo:

 ¿Son iguales?


1. Definición, declaración y creación de arrays.  Métodos de los vectores. Ejemplo: Solución  ¿Son iguales? 

Devolverá false ya que al hacer clone, se crea un nuevo vector en una posición de memoria diferente PERO con los mismos valores que el vector que se clona, pero las referencias de memoria son diferentes.


1. Definición, declaración y creación de arrays. Inicializar  Podemos inicializar un array directamente con valores en el

momento de crearlo de la siguiente manera:

float[] temperatura = {10.2F, 12.3F, 3.4F, 14.5F, 15.6F, 16.7F};


1. Definición, declaración y creación de arrays. Recorrer

 Consiste en ir de la primera posición a la ultima del array.  Para ello se recomienda usar un bucle de tipo for.  Ejemplo: Si fuera a listar el contenido de todo el array: lo recorro

y lo muestro

for (int i=0;i< v.length;i++) System.out.print (v[i]);

 Presta atención a i<v.length, ya que el signo de menor es

indispensable para no ir hasta la posición 8 (del ejemplo anterior) ya que la ultima posición es 7 ya que la primera es la numero cero en un array de 8 posiciones.


1. Definición, declaración y creación de arrays. Cargado Total  Consiste en cargar información en todo el array.  Para ello se recorre y se carga desde teclado.  Ejemplo: //se carga el array por teclado Scanner dato=new Scanner(System.in); for(int i=0;i<v.length;i++){ System.out.println("Ingrese un numero en la posicion "+i+"->"); v[i]=dato.nextInt(); }


1. Definición, declaración y creación de arrays. Actividad:  Prueba el cargado y el listado del array anterior.


1. Definición, declaración y creación de arrays. Asignación Directa  Puedes asignar valores directamente a los elementos de un

array, mediante la asignación en Java (con el signo de igual).

 Ejemplo: v[2]=123;  Puedes vaciar el array por ejemplo con: for (int i=0;i<v.length;i++) v[i]=0;


1. Definiciรณn, declaraciรณn y creaciรณn de arrays. Ejemplo: import java.util.Scanner; public class ProbandoArray { public static void main (String[] args) { // Se declara el array int[] v=new int[8]; // Se carga manualmente v[0]=4; v[1]=5; v[2]=1; v[3]=4; v[4]=3; v[5]=7; v[6]=8; v[7]=1;


1. Definición, declaración y creación de arrays. Ejemplo: (continuación) // Se recorre e imprime por pantalla for(int i=0;i<v.length;i++) System.out.println(v[i]); // Se carga el array por teclado Scanner dato=new Scanner(System.in); for(int i=0;i<v.length;i++){ System.out.println("Ingrese un número en la posición "+i+"->"); v[i]=dato.nextInt(); }


1. Definición, declaración y creación de arrays. Ejemplo: (continuación) // Se lista nuevamente el array for(int i=0;i<v.length;i++) System.out.println("En la posición "+i+" está el número "+v[i]); } }


1. Definición, declaración y creación de arrays. Actividad:  Carga el siguiente array mediante asignación directa con

números al azar del 1 al 100, y después muéstralo por pantalla.

Pseudocódigo:

INICIO Declarar el array Para i de 0 a 7 de 1 en 1 v[i]=azar(100) Fin Para Para i de 0 a 7 de 1 en 1 Mostrar v[i] Fin Para FIN


1. Definición, declaración y creación de arrays. Imaginad que estas variables están dentro del método main


1. Definición, declaración y creación de arrays.

Imaginad que estas variables están dentro del método main


1. Definición, declaración y creación de arrays.  Ejemplo 3:

Imaginad que estas variables están dentro del método main


1. Definición, declaración y creación de arrays.  Ejemplo 3 (continuación):


1. Definiciรณn, declaraciรณn y creaciรณn de arrays.


1. Definiciรณn, declaraciรณn y creaciรณn de arrays.


1. Definición, declaración y creación de arrays.  Paso de parámetros por referencia: los valores de tipo array, y

en general cualquier objeto, se pasa siempre por referencia.


1. Definición, declaración y creación de arrays.  Paso de parámetros por referencia.


1. Definición, declaración y creación de arrays.  Paso de parámetros por referencia. Ejemplo:

 ¿Qué valdrá v[0] antes y después?


1. Definición, declaración y creación de arrays.  Paso de parámetros por referencia. Ejemplo:  ¿Qué valdrá v[0] antes y después?  Valdrá lo mismo ‘0’ (cero). Se le ha pasado al método el valor de v[0], no la referencia, ya que los tipos de datos primitivos se pasan por valor, por lo tanto v[0] seguirá apuntando a la misma dirección de menoría que apuntaba, y contendrá el mismo valor que tenía esa dirección de memoria antes de llamar al método, ya que solo se ha cambiado el valor de la variable local ‘a’ del método ’cambia’.


1. Definición, declaración y creación de arrays.  Paso de parámetros por referencia.  CUIDADO: Cuando le pasamos un vector como parámetro a un método, Java crea una referencia local al método. Es decir, estará la referencia principal que apunta a dicho array y además una referencia local que apunta a dicha posición de memoria. Es decir si esa referencia local se modificase, se modificarían los valores del array, pero al acabar dicho método esa referencia local desaparece. Ejemplo:


1. Definición, declaración y creación de arrays.  Paso de parámetros por referencia.  CUIDADO: Ejemplo:

class Ejercicio2 { int static a[] = {1, 3, 5}; public static void modificarArray(int a[]){ int [] b = {2, 4, 6, 8}; a[0] = b[0]; b[1] = a[1]; a[2] = b[2]; a = b; for (int i = 2; i < a.length; i++) System.out.println(a[i]); } public static void main(String [] args){ modificarArray(a); for (int i = 0; i < a.length; i++) System.out.println(a[i]); } }


1. Definición, declaración y creación de arrays.  Paso de parámetros por referencia.  CUIDADO: Ejemplo: (continuación) El resultado sería el siguiente: 6 8 2 3 6 Alguien podría pensar que aparecería también el valor final 8, ya que se hace una asignación a=b; pero solo se hace la asignación a la referencia local del método ‘a’ dentro de dicho método, una vez finalizado el método esa referencia local del método ‘a’ desaparece, y la referencia a del main, sigue apuntando a ‘a’ del main, con lo cual sí que se accede a las posiciones de memoria, y por lo tanto se modifica dicho contenido, pero sigue apuntando a donde apuntaba a, esa referencia no se ha modificado por a=b; solo se ha modificado la referencia en el método.


1. Definición, declaración y creación de arrays.  Paso de parámetros por referencia.  CUIDADO: Ejemplo: (continuación)  b -> 2, 4, 6 ,8  a (main), a(método)-> 1, 3, 5

Después de a=b;  b, a(método) -> 2, 3, 6, 8  a (main) -> 2, 3, 6


1. Definición, declaración y creación de arrays.  Paso de parámetros por valor.

 Después de realizar la llamada al método badSwap, las

variables que se utilizaron para llamar a dicho método contendrán el mismo valor que antes de llamar a dicho método, ya que se ha hecho un paso de parámetros por valor.


1. Definición, declaración y creación de arrays.  Paso de parámetros por referencia.  Ejemplo:


1. Definición, declaración y creación de arrays.  Paso de parámetros por referencia.  Ejemplo: (continuación)  Después de ejecutar el main(), el código anterior mostrará por consola lo siguiente:


1. Definición, declaración y creación de arrays.  Paso de parámetros por referencia.  Ejemplo: (continuación)  ¿Por qué? ¿Qué ha pasado?  Java realmente cuando se le pasa un objeto (cualquier dato que no sea de tipo primitivo) como parámetro a un método, crea una referencia local a ese objeto dentro del método, o dicho en otras palabras, pasa la referencia del objeto por valor. Por lo tanto lo que se modifique al contenido de lo que apuntan esas referencias pasadas como valor, se hará permanente, pero el cambio de referencias, machacar una referencia pasada por valor por otra referencia, sólo se verá dentro del método, al acabar éste, esa referencia machacada será solo local al método, luego la referencia original apuntará donde apuntaba antes de llamar al método, pero todo aquello que se haya modificado apuntando a esa referencia original, se habrá hecho de manera permanente.


1. Definición, declaración y creación de arrays.  Paso de parámetros por referencia.  Ejemplo: (continuación)  ¿Por qué? ¿Qué ha pasado?


1. Definición, declaración y creación de arrays.  Paso de parámetros por referencia.  Ejemplo: (continuación)  ¿Por qué? ¿Qué ha pasado? Antes de llamar a tricky()

Después de llamar a tricky()


1. Definición, declaración y creación de arrays.  Paso de parámetros por referencia.  Más info: 

http://www.javaworld.com/article/2077424/learnjava/does-java-pass-by-reference-or-pass-by-value.html


2. Vectores multidimensionales รณ matrices.


2. Vectores multidimensionales รณ matrices.


2. Vectores multidimensionales รณ matrices.


2. Vectores multidimensionales รณ matrices.


2. Vectores multidimensionales ó matrices. ACLARACIÓN MUY IMPORTANTE:  Un array bidimensional es un array de arrays, independientemente de la longitud de cada uno de los arrays contenidos en cada array (filas).  Una matriz es un array bidimensional el cual todas sus filas tienen el mismo número de columnas. Si NO es así, NO es una matriz.


2. Vectores multidimensionales รณ matrices.


2. Vectores multidimensionales รณ matrices.


2. Vectores multidimensionales รณ matrices.


2. Vectores multidimensionales Ăł matrices. ď‚— Ejemplo: for (int i=0;i<5;i++){ for (int j=0;j<8;j++){ matriz[i][j]=i+j; } }

Almacena en cada celda de la matriz, la suma de la posiciĂłn de la columna y la fila.


3. Algoritmos de ordenación.  Los algoritmos de ordenación se aplican de normal

en vectores unidimensionales y su finalidad es organizar los datos de dichos arrays o vectores.  No todos los algoritmos de ordenación ordenan de la misma forma, unos son más rápidos, otros más eficientes…


3. Algoritmos de ordenación. Métodos Iterativos.  Estos métodos son simples de entender y de programar ya que son iterativos, simples ciclos y sentencias que hacen que el vector pueda ser ordenado. Dentro de los algoritmos iterativos encontramos:  Burbuja  Cocktail Sort  Inserción  Selección  Shell Sort


3. Algoritmos de ordenación. Métodos Recursivos.  Estos métodos son aún más complejos, requieren de mayor atención y conocimiento para ser entendidos. Son rápidos y efectivos, utilizan generalmente la técnica: Divide y Vencerás, que consiste en dividir un problema grande en varios pequeños para que sea más fácil resolverlos.  Mediante llamadas recursivas a sí mismas, es posible que el tiempo de ejecución y de ordenación sea más óptimo. Dentro de los Algoritmos Recursivos encontramos:  Ordenamiento por Mezclas (Merge Sort)  Ordenamiento Rápido (Quick Sort)


3. Algoritmos de ordenaciรณn.


3. Algoritmos de ordenaciรณn.


3. Algoritmos de ordenaciรณn.


3. Algoritmos de ordenación. Ordenación por el método de la burbuja.  Se basa en el principio de comparar e intercambiar

pares de elementos adyacentes hasta que todos estén ordenados.  Desde el primer elemento hasta el penúltimo no ordenado.  Comparar cada elemento con su sucesor e intercambiarlos si no están en orden.


3. Algoritmos de ordenación. Ordenación por el método de la burbuja.  Muy utilizado porque es sencillo de entender e

implementar.  Al igual que las burbujas de aire en el agua suben a la superficie, los elementos mayores de la lista se irán colocando al final del vector de forma ordenada.


3. Algoritmos de ordenación. Ordenación por el método de la burbuja.


3. Algoritmos de ordenación. Ordenación por el método de la burbuja.

En el bucle más externo, realizaremos n-1 pasadas. En cada una de ellas lograremos que el elemento de mayor valor se sitúe al final. El motivo de realizar n-1 pasadas y no n es que si en cada pasada logramos ordenar un elemento, cuando tengamos en orden los n-1 del final del array, el elemento que queda es necesariamente el más pequeño de todos.


3. Algoritmos de ordenación. Ordenación por el método de la burbuja.  Otra manera de hacerlo, es el mismo pero se hacen menos pasadas, pero no es el mejorado:


3. Algoritmos de ordenación. Ordenación por el método de la burbuja.  Otra manera de hacerlo, es el mismo pero se hacen menos pasadas, pero no es el mejorado: (Aclaración)  ¿Por qué llego hasta j<A.length-1-i? 

(-i) Porque yo sé que en cada pasada voy a ir colocando los últimos al final del array, es decir, en la primera pasada el mayor elemento del array estará en la última posición, que es la que le corresponde, con lo cual no me hará falta comparar el resto de elementos con el elemento que hay en la posición final. En la siguiente pasada, el siguiente mayor irá en la posición penúltima, que será su lugar final, y no tendré que compararlo con ninguno más, y así sucesivamente. (-1) Porque comparo dentro del bucle el elemento que está en la posición (j+1) y si no pongo este -1, j llegaría al valor v.length-1, entonces el elemento j+1 cuando j vale v.length-1 sería v.length, una posición que no existe, con lo cual nos lanzaría la excepción ArrayIndexOutOfBoundsException.


3. Algoritmos de ordenación. Ordenación por el método de la burbuja.  Funcionamiento del algoritmo:  Realizaremos n-1 pasadas. En cada una de ellas lograremos que el elemento de mayor valor se sitúe al final. El motivo de realizar n-1 pasadas y no n es que si en cada pasada logramos ordenar un elemento, cuando tengamos en orden los n-1 del final del array el elemento que queda es necesariamente el más pequeño de todos.  En cada pasada recorreremos el array empezando por el principio hasta un cierto punto, comparando cada elemento con el siguiente, y si un elemento y el siguiente no están en orden, los intercambiamos de posición, logrando que el mayor de ellos vaya ascendiendo por el array.


3. Algoritmos de ordenación. Ordenación por el método de la burbuja.  Funcionamiento del algoritmo:  En la primera pasada, compararemos cada uno de los n-1 primeros elementos con el siguiente, y lograremos que en la última posición se coloque el mayor de ellos.  En la segunda pasada, compararemos cada uno de los n-2 primeros elementos con el siguiente. No llegaremos a hacer ninguna comparación que implique al último elemento del array, porque sabemos que ese ya lo colocó en orden la primera pasada. Al término de la segunda pasada quedará también en orden el penúltimo elemento del array.  En la tercera pasada haremos lo mismo con los n-3 primeros elementos, logrando colocar el antepenúltimo elemento... y así sucesivamente, hasta que tengamos colocados los n-1 últimos elementos. Cuando estemos en esa situación, el primer elemento también estará en orden, ya que será el más pequeño de todos.


3. Algoritmos de ordenación. Ordenación por el método de la burbuja.  Código NO del todo eficiente, porque si el vector ya

está ordenado el procedimiento seguirá comprobando hasta terminar sin tener en cuenta este hecho.  Para conseguir esto, basta con utilizar un flag que marque si el vector está ordenado o no, y en el caso que el algoritmo realice una pasada sin realizar ningún intercambio de elementos, el proceso parará.


3. Algoritmos de ordenación. Mejora Ordenación por el método de la burbuja.

En el momento que haga una pasada desde j hasta j<A.length-pasada-1 SIN realizar ningún intercambio (entrar en la condición if), querrá decir que ya están ordenados.


3. Algoritmos de ordenación. Mejora Ordenación por el método de la burbuja.

 Ventajas:  Simplicidad del algoritmo.  Desventajas:  El problema de este algoritmo es que solo compara los elementos adyacentes del array. Si el algoritmo comparase primero elementos separados por un amplio intervalo y después se centrase progresivamente en intervalos más pequeños, el proceso sería más eficaz. Esto llevo al desarrollo de Shell Sort y Quick Sort.


3. Algoritmos de ordenación. Ordenación por el método de la burbuja.  Si todavía no te ha quedado claro, mira el siguiente vídeo

sobre este algoritmo aplicado a las cartas:

 http://www.youtube.com/watch?v=iVtbxd3zuds  http://www.youtube.com/watch?v=1JvYAXT_064 (mejorado)


3. Algoritmos de ordenación. Ordenación por el método de Cocktail Sort (burbuja bidireccional)  Es un ordenamiento por burbuja pero bidireccional.  http://www.youtube.com/watch?v=KVQ2bGY18OU  http://www.youtube.com/watch?v=KPlBXey1jII  http://www.youtube.com/watch?v=hzuvJjcb7cU  http://www.youtube.com/watch?v=dW4B99wJNJc


3. Algoritmos de ordenación. Ordenación por el método de Cocktail Sort (burbuja bidireccional) Suponer que swap es un método que ya está implementado que intercambia los elementos de posición, el que está en pos lo pone en pos-1 o pos+1 (dependiendo la llamada) y viceversa.

// dirección ->

// dirección <-


3. Algoritmos de ordenación.

Ordenación por el método de Cocktail Sort Mejorado (burbuja bidireccional)

// dirección ->

// dirección <-


3. Algoritmos de ordenación. Ordenación por el método de Inserción.  Inicialmente se toma el primer elemento, a continuación se toma el segundo y se inserta en la posición adecuada para que ambos estén ordenados, se toma el tercero y se vuelve a insertar en la posición adecuada para que los tres estén ordenados, y así sucesivamente. Suponemos el primer elemento (i=0) ordenado. Desde el segundo (i=1) hasta el último elemento(i=n-1), hacer:

1. 2. 1. 2. 3. 4.

suponer ordenados los (i –1)primeros elementos. tomar el elemento i. buscar su posición correcta entre los elementos que hay desde 0 hasta i-1. insertar dicho elemento, obteniendo i elementos ordenados.


3. Algoritmos de ordenación. Ordenación por el método de Inserción.  Funcionamiento del algoritmo. Supondremos que el array tiene

n elementos.

 Realizaremos n-1 pasadas. En cada una de ellas analizaremos un

elemento, colocándolo en orden relativo con respecto a los analizados en pasadas anteriores. El motivo de realizar n-1 pasadas y no n es que empezamos por el segundo elemento. Si analizásemos el primer elemento deberíamos colocarlo en orden con respecto a los anteriores, pero al no haber realizado pasadas anteriores, el primer elemento forma él solito una lista ordenada. Así pues, empezamos con el segundo directamente.  En cada pasada escogemos un elemento sucesivamente (en la primera pasada el segundo elemento, en la segunda el tercero.... en la n-1 el n) y recorreremos el array hacia atrás (hacia la izquierda, si lo prefieres) buscando el orden relativo o posición correcta del elemento en cuestión entre los anteriores (los de su izquierda). Cada vez que encontremos un elemento que sea mayor que él realizaremos un intercambio.


3. Algoritmos de ordenación. Ordenación por el método de Inserción.  Ejemplo:


3. Algoritmos de ordenación. Ordenación por el método de Inserción.  Ejemplo más detallado junto con el algoritmo en Java: http://www.brilliantsheep.com/insertion-sort-javaimplementation/


3. Algoritmos de ordenación. Ordenación por el método de Inserción.  Ejemplo: Array de enteros A= 50, 20, 40, 80, 30.


3. Algoritmos de ordenación. Ordenación por el método de Inserción.  Alternativa 1:

 El bucle principal de la ordenación por inserción va examinando sucesivamente todos

los elementos de la matriz desde el segundo hasta el n-ésimo, e inserta cada uno en el lugar adecuado entre sus predecesores dentro de la matriz. Empezamos a partir del segundo ya que una lista de un solo elemento ya está ordenado.


3. Algoritmos de ordenación. Ordenación por el método de Inserción.  Alternativa 2:

 El bucle principal de la ordenación por inserción va examinando

sucesivamente todos los elementos de la matriz desde el segundo hasta el n-ésimo, e inserta cada uno en el lugar adecuado entre sus predecesores dentro de la matriz.


3. Algoritmos de ordenación. Ordenación por el método de Inserción.  Alternativa 3: (intercambio por parejas desde i hasta 0)


3. Algoritmos de ordenación. Ordenación por el método de Inserción.  Si todavía no te ha quedado claro, mira el siguiente vídeo

sobre este algoritmo aplicado a las cartas:

 http://www.youtube.com/watch?feature=player_embedded&v=gTx

FxgvZmQs (Alternativa 1 y 2)  http://www.youtube.com/watch?v=f4d_GanLgzw (Alternativa 1)  http://www.youtube.com/watch?v=uBHzxrRLa4M (Alternativa 3)


3. Algoritmos de ordenación. Ordenación por el método de Selección.  Este método se basa en que cada vez que se mueve un

elemento, se lleva a su posición correcta.  Se comienza examinando todos los elementos, se localiza el más pequeño y se sitúa en la primera posición. A continuación, se localiza el menor de los restantes y se sitúa en la segunda posición. Se procede de manera similar sucesivamente hasta que quedan dos elementos. Entonces se localiza el menor y se sitúa en la penúltima posición y el último elemento, que será el mayor de todos, ya queda automáticamente colocado en su posición correcta.  Para i desde la primera posición hasta la penúltima (ya que en la última iteración que será para el último elemento, ya quedará en su posición correcta, la última).  Localizar menor desde i hasta el final.  Intercambiar ambos elementos .


3. Algoritmos de ordenación. Ordenación por el método de Selección. Alternativa 1: // Llegamos hasta el penúltimo, ya que en la iteración n solo quedará un elemento que será el mayor de todos. // Si la posición del menor es diferente de i, quiere decir que he encontrado un elemento menor al de la posición i. Los intercambio.


3. Algoritmos de ordenación. Ordenación por el método de Selección. Alternativa 2:


3. Algoritmos de ordenación. Ordenación por el método de Selección.

 Aclaraciones:  En el bucle más exterior empiezo en 0 y llego hasta v.length-1-1(<), ¿Por qué? Porque llegamos hasta el penúltimo, ya que en la iteración n solo quedará un elemento que será el mayor de todos, no hará falta buscar más ya que los elementos anteriores ya estarán ordenados.


3. Algoritmos de ordenación. Ordenación por el método de Selección.  Ejemplo:


3. Algoritmos de ordenación. Ordenación por el método de Selección.  Ejemplo: (continuación)


3. Algoritmos de ordenación. Ordenación por el método de Selección.  Si todavía no te ha quedado claro, mira el siguiente vídeo

sobre este algoritmo aplicado a las cartas:

 http://www.youtube.com/watch?v=boOwArDShLU  http://www.youtube.com/watch?v=KCvr7eHXEHE

 ¿Crees que se podría mejorar?  SÍ, con un booleano, mirando que no se haya efectuado ningún cambio, con lo cual no he actualizado ese booleano, con lo cual me dice que el array está ordenado.


3. Algoritmos de ordenación. Ordenación por el método de Shell Short.

 Este método es una mejora del algoritmo de ordenamiento por Inserción (Insertsort).  Si tenemos en cuenta que el ordenamiento por inserción es mucho mas eficiente si nuestra lista de números esta semiordenada y que desplaza un valor una única posición a la vez.  Durante la ejecución de este algoritmo, los números de la lista se van casi ordenando y finalmente, el ultimo paso o función de este algoritmo es un simple método por inserción que, al estar casi-ordenados los números, es mas eficiente.


3. Algoritmos de ordenación. Ordenación por el método de Shell Short.


3. Algoritmos de ordenación. Ordenación por el método de Shell Short.  Si todavía no te ha quedado claro, mira el siguiente vídeo

sobre este algoritmo aplicado a las cartas: http://www.youtube.com/watch?v=QTtHQVRiD04


3. Algoritmos de ordenación. Ordenación por el método de Mezcla.  Este algoritmo consiste básicamente en dividir en partes iguales la lista de números y luego mezclarlos comparándolos, dejándolos ordenados.  Si se piensa en este algoritmo recursivamente, podemos imaginar que dividirá la lista hasta tener un elemento en cada lista, luego lo compara con el que esta a su lado y según corresponda, lo sitúa donde corresponde.


3. Algoritmos de ordenación. Ordenación por el método de Mezcla.  En la siguiente figura podemos ver como funciona:


3. Algoritmos de ordenación. Ordenación por el método de Mezcla.  El algoritmo de ordenamiento por mezcla (Mergesort) se divide en dos procesos, primero se divide en partes iguales la lista:


3. Algoritmos de ordenación. Ordenación por el método de Mezcla.  Y el algoritmo que nos permite mezclar los elementos según corresponda:


3. Algoritmos de ordenación. Ordenación por el método Rápido (Quicksort).  Sin duda, este algoritmo es uno de los mas eficientes. Este método es el mas rápido gracias a sus llamadas recursivas, basándose en la teoría de divide y vencerás.  Lo que hace este algoritmo es dividir recursivamente el vector en partes iguales, indicando un elemento de inicio, fin y un pivote (o comodín) que nos permitirá segmentar nuestra lista. Una vez dividida, lo que hace, es dejar todos los mayores que el pivote a su derecha y todos los menores a su izq. Al finalizar el algoritmo, nuestros elementos están ordenados.


3. Algoritmos de ordenación. Ordenación por el método Rápido (Quicksort).  Por ejemplo, si tenemos 3 5 4 8 básicamente lo que hace el algoritmo es dividir la lista de 4 elementos en partes iguales, por un lado 3, por otro lado 4 8 y como comodín o pivote el 5. Luego pregunta, 3 es mayor o menor que el comodín? Es menor, entonces lo deja al lado izq. Y como se acabaron los elementos de ese lado, vamos al otro lado. 4 Es mayor o menor que el pivote? Menor, entonces lo tira a su izq. Luego pregunta por el 8, al ser mayor lo deja donde esta, quedando algo así: 3 4 5 8


3. Algoritmos de ordenación. Ordenación por el método Rápido (Quicksort).  En esta figura se ilustra de mejor manera un vector con mas elementos, usando como pivote el primer elemento:


3. Algoritmos de ordenación. Ordenación por el método Rápido (Quicksort).


3. Algoritmos de ordenación.  Todos los algoritmos vistos de manera visual y su

implementación:

http://www.sorting-algorithms.com/


3. Algoritmos de ordenación. Complejidad.  Cada

algoritmo de ordenamiento por definición tiene operaciones y cálculos mínimos y máximos que realiza (complejidad), a continuación una tabla que indica la cantidad de cálculos que corresponden a cada método de ordenamiento:


3. Algoritmos de ordenaciĂłn. ComparaciĂłn de tiempos. ď‚— Se han ordenado una cantidad determinada de elementos aleatorios en una lista mediante distintos mĂŠtodos de ordenamiento. (en segundos)


3. Algoritmos de ordenaciรณn. Comparaciรณn de tiempos.


3. Algoritmos de ordenación. Comparación de tiempos.  Como podemos analizar, el algoritmo que se va demorando

cada vez mas tiempo es el de la burbuja, luego de selección y tercero el inserción. Los algoritmos que los siguen son el Shell y el de ordenación por mezcla, pero el mas optimo es el “Rápido”


4. Problemas de recorrido y búsqueda en vectores.  Muchos de los problemas que se plantean cuando se

utilizan vectores pueden clasificarse en dos grandes grupos de problemas genéricos:  Recorrido de un vector.  Búsqueda de un elemento.


4. Problemas de recorrido y búsqueda en vectores. Problemas de recorrido: Se clasifican como tal, todos aquellos que para su resolución exigen algún tratamiento de todos los elementos del vector. El orden para el tratamiento de los elementos del vector puede organizarse de muchas maneras: ascendentemente, descendentemente, simultáneamente ascendente y descendente, etc.  Ejemplo: La cantidad máxima llovida en un solo día a lo largo de un determinado mes.  Solución: Hay que recorrer el array entero para saber qué día del mes ha llovido más.


4. Problemas de recorrido y búsqueda en vectores. Problemas de búsqueda: Se clasifican como tal, todos aquellos que conllevan el determinar si existe algún elemento del vector que cumpla una propiedad dada.  Con respecto a los problemas de recorrido presentan la diferencia de que no es siempre necesario tratar todos los elementos del vector, ya que el elemento buscado puede encontrarse inmediatamente, encontrarse tras haber recorrido todo el vector, o incluso no encontrarse.  Ejemplo: Determinar a partir de un vector que contenga cantidades de lluvia, un día que la pluviosidad haya superado los 100 litros.  Solución: Una vez haya encontrado un día que la pluviosidad supere los 100 litros, ya no busca más.


4. Problemas de recorrido y búsqueda en vectores.  Problemas combinados: La solución de problemas

reales exige a veces la realización combinada de técnicas de recorrido y búsqueda.


4. Problemas de recorrido y búsqueda en vectores.  Hay dos tipos de búsqueda:  Búsqueda Lineal.  Búsqueda Binaria.


4. Problemas de recorrido y búsqueda en vectores. Búsqueda Lineal.  Es la forma más simple de buscar un elemento y consiste en examinar secuencialmente uno a uno hasta encontrar el buscado o haber revisado todos los elementos sin éxito.


4. Problemas de recorrido y bĂşsqueda en vectores. BĂşsqueda Lineal.


4. Problemas de recorrido y bĂşsqueda en vectores.


4. Problemas de recorrido y bĂşsqueda en vectores.


4. Problemas de recorrido y búsqueda en vectores. Búsqueda Binaria.  Si los elementos sobre los que se realiza la búsqueda están ordenados (los podemos ordenar por los distintos algoritmos de ordenación que hemos visto), entonces podemos utilizar un algoritmo de búsqueda mucho más rápido que el secuencial, la búsqueda binaria.


4. Problemas de recorrido y búsqueda en vectores. Búsqueda Binaria.  Consiste en reducir paulatinamente el ámbito de búsqueda

a la mitad de los elementos, basándose en comparar el elemento a buscar con el elemento que se encuentra en la mitad del intervalo y en base a esta comparación:  Si el elemento buscado es menor que el elemento medio, entonces sabemos que el elemento está en la mitad inferior de la tabla.  Si es mayor es porque el elemento está en la mitad superior.  Si es igual se finaliza con éxito la búsqueda ya que se ha encontrado el elemento.


4. Problemas de recorrido y búsqueda en vectores. Búsqueda binaria.  http://www.youtube.com/watch?v=6yogn3JUqSg


4. Problemas de recorrido y búsqueda en vectores. Búsqueda binaria. Código Versión Iterativa.


4. Problemas de recorrido y búsqueda en vectores. Búsqueda binaria. Código Versión Iterativa (otra alternativa).


4. Problemas de recorrido y búsqueda en vectores. Búsqueda binaria. Código Versión Recursiva.


5. Cadenas de caracteres.


5. Cadenas de caracteres. La clase String.

Actividad: Ves a la API de Java 7 y busca la clase String, observa sus métodos y comenta aquéllos que te llamen la atención.


5. Vectores de objetos String.

String lista[]){ int POS=10;

String []

int POS=10;

(lista);


5. Cadenas de caracteres. La clase String.


5. Cadenas de caracteres. La clase String.


5. Cadenas de caracteres. La clase String.


5. Cadenas de caracteres. La clase String.


5. Cadenas de caracteres. La clase String.


5. Cadenas de caracteres. La clase String.


5. Cadenas de caracteres. La clase String.


5. Cadenas de caracteres. La clase String.

Un char es un nĂşmero entero realmente (cĂłdigo ASCII)


5. Cadenas de caracteres. La clase String.

También se podría usar el método toString(tipoNumero) de la clase que queremos convertir dicho número a cadena de texto. Ejemplo: String a = Integer.toString(8);

Lo mismo podríamos hacer con otros tipos de datos Double, Long, Float, …


5. Cadenas de caracteres. La clase String.

También podíamos hacer usado el método estático parseDouble(String dato) de la clase Double. double numero = Double.parseDouble("7.5");


5. Cadenas de caracteres. La clase StringBuffer.

Más información aquí.


5. Cadenas de caracteres. La clase StringBuffer.


5. Cadenas de caracteres. La clase StringBuffer.


5. Cadenas de caracteres. La clase StringBuffer.


5. Cadenas de caracteres. La clase StringBuffer.


5. Cadenas de caracteres. La clase StringTokenizer. (por defecto, se puede cambiar)

Más información aquí.


5. Cadenas de caracteres. La clase StringTokenizer. ď‚— La clase StringTokenizer nos ayuda a dividir un

string en substrings o tokens, en base a otro string (normalmente un carĂĄcter) separador entre ellos denominado delimitador.


5. Cadenas de caracteres. La clase StringTokenizer.  Ejemplo de uso:  Supongamos un String consistente en el nombre, y los dos apellidos de una persona separados por espacios en blanco.  La clase StringTokenizer nos ayuda a romper dicho String en tres substrings basado en que el carácter delimitador es un espacio en blanco.


5. Cadenas de caracteres. La clase StringTokenizer.  Características:  Se incluye en el paquete java.util.  Los tokens se separan mediante delimitadores. Los delimitadores por defecto son:     

espacio en blanco tabulador \t salto de línea \n retorno \r avance de página \f


5. Cadenas de caracteres. La clase StringTokenizer.  Uso:  Un objeto StringTokenizer se construye a partir de un objeto String.  Para obtener los tokens del String podemos utilizar los métodos hasMoreTokens() y nextToken(). 

hasMoreTokens() devuelve true si hay más tokens que obtener de una cadena. nextToken() devuelve un String con el siguiente token. Lanza una excepción del tipo NoSuchElementException si no hay más tokens.


5. Cadenas de caracteres. La clase StringTokenizer.  Ejemplo de uso:  Para extraer el nombre, el primer apellido y el segundo apellido en el primer ejemplo, escribiremos: String nombre="Angel Franco García"; StringTokenizer tokens=new StringTokenizer(nombre); while(tokens.hasMoreTokens()){ System.out.println(tokens.nextToken()); }


5. Cadenas de caracteres. La clase StringTokenizer.  Ejemplo de uso:  También podíamos haber separado el anterior String en tokens únicamente con el método nextToken(), poniéndolo dentro de un try, así cuando saltase la excepción de que ya no hay más tokens que leer, pasamos al finally ó catch.


5. Cadenas de caracteres. La clase StringTokenizer.  Ejemplo de uso: (continuación)  Se ha separado el String nombre en tokens separados por el delimitador por defecto. En este caso el espacio en blanco. Angel Franco García


5. Cadenas de caracteres. La clase StringTokenizer.  Uso: (continuación)  La instrucción: StringTokenizer tokens=new StringTokenizer(nombre); 

Separa el String en tokens y el objeto tokens apunta al primero. A continuación:

st.hasMoreTokens() 

comprueba si hay tokens que extraer. En este caso tokens apunta a un token, por lo tanto hasMoreTokens() devuelve true. A continuación:

st.nextToken() 

Obtiene el token al que apunta tokens (Angel) y avanza al siguiente


5. Cadenas de caracteres. La clase StringTokenizer.  Uso: (continuación)  El ciclo while repite el proceso.  Cuando se alcanza el último token y se avanza al siguiente la condición del while será false.


5. Cadenas de caracteres. La clase StringTokenizer.  Uso: (continuación)  Los delimitadores se pueden especificar cuando se crea el objeto StringTokenizer. 

Por ejemplo, para indicar que los delimitadores son la coma y el espacio en blanco:

StringTokenizer st =

new StringTokenizer("colores rojo, verde y azul", ", ");


5. Cadenas de caracteres. La clase StringTokenizer.  Uso: (continuación)  La ejecución del while anterior obtendría la salida: colores rojo verde y azul  La coma no aparece ya que se ha especificado como

delimitador y los delimitadores no aparecen.


5. Cadenas de caracteres. La clase StringTokenizer.  Uso: (continuación)  Si queremos que aparezcan los delimitadores se debe escribir true como tercer argumento en el constructor: StringTokenizer st = new StringTokenizer("colores rojo, verde y azul", ", ", true);  En este caso la salida es: colores rojo , verde y azul


5. Cadenas de caracteres. La clase StringTokenizer.  Uso: (continuación)  StringTokenizer es una clase legada que es mantenida por razones de compatibilidad aunque su uso es disuadido en un nuevo código. recomendado que si alguien busca esta funcionalidad use el metodo split de String o el paquete java.util.regex package en lugar de eso.

 Es


5. Cadenas de caracteres. La clase StringTokenizer.  Uso método split() de la clase String:  El siguiente ejemplo muestra como el método String.split(String delim) puede ser usado para dividir una cadena en sus tokens basicos.  Se le pasa una cadena de texto que es el delimitador para separar la cadena en diferentes Strings. String[] result = "this is a test".split(“ “); for (int x=0; x<result.length; x++) System.out.println(result[x]);  Imprime la siguiente salida: this is a test


5. Cadenas de caracteres. La clase StringTokenizer.  Uso método split() de la clase String: (continuación)  NO funciona como la clase StringTokenizer en el sentido de que separa por la cadena que le pasemos como parámetro, es decir, ejemplo: String[] result = "this, is: a test".split(“,:“);

El resultado será la misma cadena, ya que busca un delimitador que sea “,:” y no como hace StringTokenizer que busca uno de los delimitadores “,” o “:”.  Si ponemos: String[] result = "this, is a test".split(“,“);

El resultado será:

this is a test


5. Cadenas de caracteres. La clase StringTokenizer.  Todos

hemos tenido que utilizar alguna vez StringTokenizer para separar subcadenas a partir de una cadena dada.  Esto es muy sencillo si esas subcadenas son independientes entre sí. Pero ¿y si se organizan en forma "clave-valor"? Por ejemplo, la siguiente cadena tiene la forma "jugador-deporte": "Ronaldo=Futbol;Gasol=Baloncesto;Nadal=Tenis;Jordan=Baloncesto;"


5. Cadenas de caracteres. La clase StringTokenizer.  Aquí tendríamos que tener en cuenta dos caracteres

separadores: "=" y ";".  Además, las subcadenas habría que tratarlas teniendo en cuenta que las impares son nombres de deportistas y que las pares son nombres de deportes. Ejemplo:


5. Cadenas de caracteres. La clase StringTokenizer. import java.util.StringTokenizer; public class PruebaST{ public static void main(String args[]) { String entrada = "Ronaldo=Futbol;Gasol=Baloncesto;Nadal=Tenis;Jordan=Balonce sto;"; StringTokenizer st = new StringTokenizer(entrada, "=;"); while(st.hasMoreTokens()){ String jugador = st.nextToken(); String deporte = st.nextToken(); System.out.println(jugador + " " + deporte); } } }


5. Cadenas de caracteres. La clase StringTokenizer.  La salida que daría ese código sería la siguiente: Ronaldo Futbol Gasol Baloncesto Nadal Tenis Jordan Baloncesto


6. Estructuras de almacenamiento dinámicas.  Hasta ahora hemos visto las estructuras de almacenamiento

estáticas, que tienen como desventaja que tenemos un tamaño fijo el cual no se puede modificar.  Hay una alternativa a esto, estructuras de almacenamiento dinámicas.  Las estructuras de almacenamiento dinámicas tienen un tamaño dinámico (variable), es decir, no hay que indicarle a priori su tamaño, sino que se va haciendo más grande conforme vamos insertando elementos a la estructura.  Otra ventaja es que NO nos obligan a tener en la Colección todos los objetos del mismo tipo, es decir, todos enteros, o todos String etc etc, podemos tener objetos de diferente tipo en una misma Colección (aunque en las estructuras estáticas también se puede hacer), una colección que contenga tanto String, como número enteros etc etc. Se puede especificar que los elementos de la Colección sean todos del mismo tipo gracias a los Generics de Java (los veremos más adelante o el año que viene. RECOMENDADO).


6. Estructuras de almacenamiento dinámicas.  Las estructuras dinámicas en Java descienden todas de la

interface Collection.  Collection se encuentran en el paquete java.util.  Contiene métodos que nos permiten:  Añadir un elemento: add(Elemento)

 Eliminar un elemento: remove(posiciónDelElemento)  Consultar si contiene un elemento: contains(Elemento)  Obtener un elemento de la lista: get(Elemento)  Obtener un elemento de la lista: get(posiciónDelElemento)  Y muchos más: size(), isEmpty(), toArray(), removeAll()…

Más información aquí.


6. Estructuras de almacenamiento dinรกmicas.


6. Estructuras de almacenamiento dinámicas.  La Java Collections Framework (JCF) está constituída

por sus

 interfaces (las más importantes List, Set y Map),  interfaces de soporte (Iterator, ListIterator, Comparable y

Comparator)  y de clases de distintos usos, es decir, las implementaciones de las interfaces, y que sirven para almacenar y manipular grupos de datos como una sola unidad, como una colección (HashSet, TreeSet, ArrayList, LinkedList, HashMap, TreeMap, etc.).  También hay clases abstractas que tienen total o parcialmente implementados los métodos de la interface correspondiente, y que sirven para que los usuarios deriven de ellas sus propias clases de forma más sencilla.


6. Estructuras de almacenamiento dinรกmicas.


6. Estructuras de almacenamiento dinámicas. Diferencia entre List, Set y Map  List es una lista que tiene un orden arbitrario y

permite acceder a un elemento por orden. Permite introducir elementos repetidos.  Set es una lista pero se le conoce como conjunto La diferencia que tiene con un List es que NO se le puede añadir duplicados .  Map es una especie de diccionario que contiene parejas de clave y valor. Además NO pueden repetirse claves, cuando añades un dato repetido lo que hace es que remplaza lo que había antes.


6. Estructuras de almacenamiento dinámicas. Interfaces Comparable y Comparator

 Sirven para mantener ordenadas las listas, así como los sets y los maps que

deban mantener un orden.  Comparable declara el método compareTo() que compara su argumento implícito por el que se le pasa por parámetro, devolviendo -1, 0 ó 1 según el argumento sea anterior, igual o posterior al objeto o: public int compareTo(Object o);  Comparator permite ordenar listas y colecciones cuyos objetos pertenecen a

clases de cualquier tipo. La idea es parecida a la de Comparable, pero el usuario debe proporcionar la implementación de la interface. Esta interface declara los métodos equals(), que compara dos Comparators, y compare(), que devuelve -1, 0 ó 1 según el argumento sea anterior, igual o posterior al segundo: public boolean equals(Object o); public int compare(Object o1, Object o2);


6. Estructuras de almacenamiento dinámicas.  Las interfaces proporcionan métodos para todas las

operaciones comunes y las implementaciones concretas especifican la decisión de las operaciones no permitidas. (java.lang.UnsupportedOperationException)  Sobre los elementos se puede iterar (Iterator). Se

recomienda Colección.

usar

Iterator

para

recorrer

cualquier


6. Estructuras de almacenamiento dinámicas. Características:  Incrementa su capacidad como sea necesario.  Se puede saber el tamaño con el método size().  Guarda los objetos en orden.  Los detalles de cómo ocurre todo esto están ocultos.  ¿Realmente importan?  ¿El hecho de no conocerlos nos impide usar la

colección?


6. Estructuras de almacenamiento dinámicas. Tipos de Colecciones:  List Una colección cuyos

elementos permanecen en un orden particular a menos que se modifique la lista (no significa lista enlazada aunque es una posible implementación). -

void add (Object element) void add(int index, Object element) Object remove(int index) Object get(int index) Object set(int index, Object element) int indexOf(Object o) int lastIndexOf(Object o) List subList(int min, int max)


6. Estructuras de almacenamiento dinámicas. Tipos de Colecciones: (continuación) - Map  Un objeto que asocia claves con valores.  No puede tener claves duplicadas. Si se pone alguna clave

duplicada, machacará el valor antigua de dicha clave al nuevo valor. -

Object put(Object key, Object value); Object remove(Object key); Object get(Object key); containsKey(Object key); containsValue(Object value); isEmpty(); size()


6. Estructuras de almacenamiento dinámicas. Tipos de Colecciones: (continuación) - SET<E> y SORTEDSET<E>

 Sirve para acceder a una colección sin elementos repetidos (hay que saber cuándo dos

objetos son considerados iguales; para ello se usan equals() y hashcode();). Puede estar o no ordenada, y no declara ningún método adicional a los de Collection. Algunos de los métodos de la interface Set son los siguientes:       

add(Object o): añade el objeto pasado por parámetro al Set siempre que éste no exista ya, y devuelve un booleano. clear(): Elimina a todos los elementos del Set. contains(Object o): devuelve true si el Set contiene el objeto pasado por parámetro. Para ello, se compara de forma interna con el método equals (o.equals(x);) o con el método hashCode(). isEmpty(): devuelve true si el Set está vacío. iterator(): devuelve un objeto iterador remove(Object o): elimina el objeto pasado por parámetro si existe y devuelve un booleano. size(): devuelve un entero que es el número de elementos del Set.

 La interface SortedSet extiende de la interface Set y añade una serie de métodos, entre los que

hay que destacar:

comparator(): obtiene el objeto pasado al constructor para establecer el orden; si se emplea el orden natural definido por la interface Comparable, devuelve null;  first() / last(): devuelve el primer o el último elemento del conjunto. 

 Existen dos implementaciones de conjuntos, como son la clase HashSet y la clase TreeSet.


6. Estructuras de almacenamiento dinĂĄmicas. Dentro de las listas (List) tenemos: ď‚— ArrayList: Clase que implementa el interface List.


6. Estructuras de almacenamiento dinámicas. Dentro de las listas (List) tenemos: ArrayList.  De forma general un ArrayList en Java se crea de la

siguiente forma (no recomendada):

ArrayList nombreArray = new ArrayList();

 Esta instrucción crea el ArrayList nombreArray vacío. Un

ArrayList declarado así puede contener objetos de cualquier tipo.


6. Estructuras de almacenamiento dinámicas. Dentro de las listas (List) tenemos: ArrayList.  Por ejemplo: ArrayList a = new ArrayList(); a.add("Lenguaje"); a.add(3); a.add('a'); a.add(23.5);  Los elementos del ArrayList a son:

“Lenguaje”

3

‘a’ 23.5


6. Estructuras de almacenamiento dinámicas. Dentro de las listas (List) tenemos: ArrayList.  Es decir, un ArrayList puede contener objetos de tipos

distintos.

 En este ejemplo, el primer objeto que se añade es el String

“Lenguaje”  El resto no son objetos. Son datos de tipos básicos pero el compilador los convierte automáticamente en objetos de su clase envolvente (clase contenedora o wrapper) antes de añadirlos al array.


6. Estructuras de almacenamiento dinámicas. Dentro de las listas (List) tenemos: ArrayList.  Se recomienda usar este tipo de creación: ArrayList<tipo> nombreArray = new ArrayList<>();  tipo debe ser una clase. Indica el tipo de objetos que contendrá el array.

 NO se pueden usar tipos primitivos. Para un tipo primitivo se debe utilizar su

clase envolvente.

 Por ejemplo: Versión Java 6 y anteriores: ArrayList<Integer> numeros = new ArrayList<Integer>(); Versión Java 7 y superiores (recomendada): ArrayList<Integer> numeros = new ArrayList<>(); //Recomendado 

Crea el array números de enteros.


6. Estructuras de almacenamiento dinámicas. Dentro de las listas (List) tenemos: ArrayList.  Algunos de los métodos más importantes del ArrayList

son:


6. Estructuras de almacenamiento dinámicas. Dentro de las listas (List) tenemos: ArrayList.  Algunos de los métodos más importantes del ArrayList

son:

Más información: http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html


6. Estructuras de almacenamiento dinámicas. Dentro de las listas (List) tenemos: ArrayList.  El método add tiene dos versiones:  Pasar un elemento para añadirse al final: names.add("Cindy");

 Pasar un índice y el nuevo elemento a añadir en esa

posición. Los otros elementos se mueven hacia la derecha. names.add(1, "Cindy");


6. Estructuras de almacenamiento dinĂĄmicas. Dentro de las listas (List) tenemos: ArrayList. ď‚— Ejemplo:

Donde hay un 4 son comillas dobles "


6. Estructuras de almacenamiento dinámicas. Dentro de las listas (List) tenemos: ArrayList.  Ejemplo:

Si realizamos un System.out.println(arrayListPropio) que reciba como parámetro un ArrayList, mostrará por pantalla el contenido del ArrayList (los elementos que contiene el ArrayList). Ejemplo: ArrayList<String> lista = new ArrayList<>(); lista.add("hola"); lista.add("mundo"); System.out.println(lista);

Si lo compilamos y ejecutamos, el resultado será el siguiente:


6. Estructuras de almacenamiento dinรกmicas. Ejemplo ArrayList.


6. Estructuras de almacenamiento dinámicas. Ejemplo ArrayList.  NOTA: Si al compilar te dice el siguiente aviso: Eso es porque estamos usando Colecciones sin usar Generics, es decir, es por esta línea: ArrayList lista = new ArrayList();

Que la deberíamos cambiar por:

ArrayList<TipoObjecto> lista = new ArrayList<TipoObjeto>();

Ó en versiones modernas (Java 7 y posteriores):

ArrayList<TipoObjecto> lista = new ArrayList<>();

Esto es porque nos recomienda que a la Colección le debemos indicar qué tipo de datos va a obtener (String, Integer, Double, etc.).


6. Estructuras de almacenamiento dinámicas. Dentro de las listas (List) tenemos: ArrayList.  ArrayList mantiene una referencia como los arrays.  Copiando una referencia: ArrayList<String> friends = names; friends.add("Harry");

 Para hacer una copia, pasar la referencia del ArrayList

original al constructor del nuevo:

ArrayList<String> newNames=new ArrayList<>(names);


6. Estructuras de almacenamiento dinámicas. Dentro de las listas (List) tenemos: ArrayList.  De igual manera que los arrays, un ArrayList puede ser usado como parámetro ó valor retornado.  Ejemplo: Método que recibe un ArrayList y devuelve la lista

invertida.


6. Estructuras de almacenamiento dinámicas. Dentro de las listas (List) tenemos: ArrayList.  Formas de recorrer una Lista.  Podemos recorrerlo de forma clásica con un bucle for:

 Con un bucle foreach:

 Si el array contiene objetos de tipos distintos o desconocemos el

tipo:


6. Estructuras de almacenamiento dinámicas. Dentro de las listas (List) tenemos: ArrayList.  Formas de recorrer una Lista. (continuación)  Utilizando un objeto Iterator. 

http://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html

La ventaja de utilizar un Iterator es que no necesitamos indicar el tipo de objetos que contiene el array. Iterator tiene como métodos:  hasNext(): devuelve true si hay más elementos en el array.  next(): devuelve el siguiente objeto contenido en el array.


6. Estructuras de almacenamiento dinámicas. Dentro de las listas (List) tenemos: ArrayList.  Formas de recorrer una Lista. (continuación)  Utilizando un objeto Iterator. Ejemplo:


6. Estructuras de almacenamiento dinĂĄmicas. Dentro de las listas (List) tenemos: ArrayList. ď‚— Ejemplo:


6. Estructuras de almacenamiento dinámicas. Dentro de las listas (List) tenemos: ArrayList.  ¿Cuándo usar arrays estáticos o dinámicos?  Usar arrays estáticos si:  El tamaño del array nunca cambia.  Queremos eficiencia.  Se tiene una lista grande de tipos primitivos.  Usar arrays dinámicos si:  

En cualquiera de los otros casos. Especialmente si se tiene un número desconocido de valores de entrada.


6. Estructuras de almacenamiento dinámicas. Dentro de las listas clave-valor (Map) tenemos:  HashMap: Una implementación de Map con una tabla hash. Crea una especie de diccionario que relaciona claves con valores. Colección de pares (clavevalor).


6. Estructuras de almacenamiento dinĂĄmicas. Ejemplo HashMap:

public class Estadistico { public static void main( String args[] ) { HashMap<Integer, Integer> tabla = new HashMap<>(); int i=0; while(i < 10) { // Generar un nĂşmero entre 0 y 10 int num = (int)(Math.random()*11); if(!tabla.containsValue(num)){ //AĂąadimos nuevo par: numero-contador tabla.put(i, num); i++; } } System.out.println(tabla); } }


6. Estructuras de almacenamiento dinรกmicas. Ejemplo HashMap: Resultado por pantalla:


6. Estructuras de almacenamiento dinámicas. Ejemplo HashMap:  El método put(Object clave, Object valor), si ya existe

dicha clave, reemplazará el valor viejo por el nuevo valor.


6. Estructuras de almacenamiento dinámicas. Ejemplo HashMap:  En este tipo de colecciones también se recomienda el uso

de Generics. Ejemplo:

HashMap<String, Integer> allDrivers = new HashMap<String, Integer>();

Ó de otra forma mejor (versiones Java 7 y posteriores) y más simplificada: HashMap<String, Integer> allDrivers = new HashMap<>();

NO pueden ser los parámetros de Generics de tipos primitivos, tienen que ser objetos (ó descendientes de ellos).


6. Estructuras de almacenamiento dinámicas. Ejemplo HashMap:  Si queremos usar un ArrayList o HashMap junto con

Generics en un método, tanto como parámetro como valor de retorno se haría así por ejemplo:

public static HashMap<String, Integer> ejemplo(ArrayList<String> aux){ //código del método }


6. Estructuras de almacenamiento dinámicas. Más sobre estas colecciones:  Una cosa curiosa y que Java se ha currado es que si

queremos mostrar por pantalla la colección, no hace falta que realicemos un bucle que lo vaya recorriendo y mostrando los valores, ejemplo: ArrayList<String> lista = new ArrayList<>(); lista.add("Néstor"); lista.add("Miguel"); for(int i=0; i<lista.size();i++) System.out.println(lista.get(i)+" ");


6. Estructuras de almacenamiento dinámicas. Más sobre estas colecciones: (continuación)  Java la presentación por pantalla de los datos que contiene

una colección (las que hemos visto antes) nos lo facilita mucho. Simplemente con pasar como parámetro la colección a un System.out.print() o System.out.println(), nos muestra la lista por pantalla formateada y válida para mostrarla por pantalla. Ejemplo: ArrayList<String> lista = new ArrayList<>(); lista.add("Néstor"); lista.add("Miguel"); System.out.println(lista);

Resultado:


6. Estructuras de almacenamiento dinámicas. Más sobre estas colecciones: (continuación)  Una cosa curiosa y que Java se ha currado es que si

queremos mostrar por pantalla la colección, no hace falta que realicemos un bucle que lo vaya recorriendo y mostrando los valores, ejemplo: HashMap<Integer,String> mapa = new HashMap<,>(); mapa.put(1, "Néstor"); mapa.put(2, "Miguel"); System.out.println(mapa);

Resultado: clave=valor


6. Estructuras de almacenamiento dinámicas. Más información sobre estructuras de almacenamiento dinámicas:  http://vayajava.blogspot.com.es/2008/05/diferencias-entre-las-

colecciones-list.html


Más cosas… Otra forma de recorrer vectores ó arrays: foreach

 En cada iteración del bucle for se almacenará en aux

cada elemento del vector v, recorriendo de esta manera el vector v y finalizando dicho bucle cuando ya no hayan más elementos que recorrer en el vector v.


Más cosas… Si quieres saber más sobre Arrays estáticos échale un vistazo a la clase Arrays  En ella hay métodos como:  Arrays.toString(tipoDato

nom[]):

Devuelve

String con los elementos del array.  Arrays.sort(tipoDato nom[]): Devuelve el ordenado.  Y muchos más…

un array


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.