Sunteți pe pagina 1din 57

Tema 9.

Arrays

Tema 09. Arrays (tablas o arreglos)

En Temas anteriores hemos estudiado los tipos de datos, tanto primitivos como
complejos. Hemos visto como trabajar con datos de ambos tipos, pero siempre de una
manera unitaria. En este Tema veremos como trabajar con conjuntos de datos a través
de los arrays.

Un array o colección nos permite trabajar con un conjunto de datos, todos del mismo tipo,
que pueden ser primitivos o complejos (=referencias).

En este Tema se estudian los arrays, las colecciones se estudiarán más adelante. Las
colecciones se crean a partir de clases especificas de la API de Java y los datos que
guardan son siempre de tipo complejo.

1. Arrays

2. Declaración y creación de un array


2.1 Declaración de un array.
2.2 La inicialización o creación de un array.
2.3 Inicialización de los elementos
2.4 El nombre del array contiene la dirección de memoria del contenido del array

3. Ejemplos y usos de arrays


3.1 Crear y recorrer un array
3.2 Inicializador de array o lista inicializadora
3.3 Suma y otros cálculos de los elementos de un array
3.4 Algoritmos de búsqueda
3.4.1 Búsqueda secuencial o lineal en un vector desordenado
3.4.2 Búsqueda secuencial o lineal en un vector ordenado
3.4.3 Búsqueda binaria o dicotómica
3.5 Algoritmos de ordenación
3.6 Actualización de un array

4. Instrucción for mejorada. Sentencia for/in

5. Paso de arrays a los métodos. Notas acerca del paso de argumentos a los métodos.
Pasar un argumento tipo array
Pasar un elemento individual de un array a un método
Notas acerca del paso de argumentos a los métodos

6. Arrays multidimensionales

7. Listas de argumentos de longitud variable

8. Uso de argumentos de línea de comandos

1-57
Tema 9. Arrays

1. Arrays

Los tipos en Java se dividen en dos categorías: tipos primitivos (byte, short, int, long, float,
double, boolean y char) y tipos de referencia o complejos.

Los arrays se consideran como tipos por referencia.

Un array es una estructura de datos que permite albergar varios elementos del mismo
tipo.

La longitud de un array (número de elementos) se establece durante su creación y una


vez establecida la longitud de un array (número de elementos), ya no se puede modificar,
por lo que se puede considerar que tiene una longitud fija.

Un elemento de un array, es el valor de una de sus posiciones, y se identifica mediante


un índice.

El número de la posición del elemento se conoce formalmente como el índice del


elemento.

Los elementos de un array pueden ser tipos primitivos o de referencia (incluyendo


arrays).

Para hacer referencia a un elemento específico en un array, debemos especificar el


nombre del array (nombre de la referencia al array) y el número de la posición (índice) del
elemento en el array encerrado entre corchetes ([]) .

nombreArray[índice] → nombre del array seguido del índice entre corchetes

2-57
Tema 9. Arrays

La siguiente figura representa un array de enteros, llamado c, que contiene 12 elementos.

c[0] -45
c[1] 20
c[2] 72
c[3] 0
c[4] 45
c[5] 12
c[6] 0
c[7] -27
c[8] 789
c[9] 91
c[10] 6453
c[11] 78

El primer elemento tiene el índice cero, y algunas veces se le denomina elemento cero.
Por lo tanto, los elementos del array c son c[ 0 ], c[ 1 ], c[ 2 ], …., c[10] y c[11]. El mayor
índice en el array c es 11.

Los nombres de los array siguen las mismas convenciones que los demás nombres de
variables.

Un índice debe ser un entero positivo. Un programa puede utilizar una expresión como
índice. Por ejemplo, si suponemos que la variable a es 5 y que b es 6, entonces la
instrucción

c[ a + b ] += 2;

suma 2 al elemento c[ 11 ] del array:

c[11]=c[11]+2

Error:
Usar un valor de tipo long como índice de un array produce un error de
compilación. Un índice debe ser un valor int, o un valor de un tipo que pueda
promoverse a int; a saber, byte, short o char, pero no long.

Los arrays son objetos. Cada instancia de un objeto conoce su propia longitud y mantiene
esta información en un campo length. La expresión c.length accede al atributo público
length del array c.

3-57
Tema 9. Arrays

Importante:
Para conocer la longitud de un array, podremos acceder a su atributo
público:length.

Examinaremos el array c con más detalle:

c[0] -45
c[1] 20
c[2] 72
c[3] 0
45
12
0
c[7] -27
789
91
6453
c[11] 78

El nombre del array es c.

La longitud del array (número de elementos) es 12.

La manera en que se hace referencia a los 12 elementos de este array es: c[ 0 ], c[ 1 ],


c[ 2 ], ..., c[ 11 ]. El valor de c[ 0 ] es -45, el valor de c[ 1 ] es 20, el de c[ 2 ] es 72, el de
c[ 7 ] es -27 y el de c[ 11 ] es 78.

Para calcular la suma de los valores contenidos en los primeros tres elementos del array c
y almacenar el resultado en la variable suma, escribiríamos lo siguiente:

suma = c[ 0 ] + c[ 1 ] + c[ 2 ];

Para dividir el valor de c[ 6 ] entre 2 y asignar el resultado a la variable x, escribiríamos lo


siguiente:

x = c[ 6 ] / 2;

Para dividir el segundo elemento entre el primer elemento y asignar el resultado al quinto
elemento del array, escribiríamos lo siguiente:

c[4]=c[1] / c[0]

4-57
Tema 9. Arrays

2. Declaración y creación de un array

2.1 Declaración de un array.

La declaración o definición de un array se realiza mediante el tipo de datos que va a


albergar, los corchetes [ ] y el nombre del array.

La sintaxis es la siguiente:

tipo[ ] nombre;
o
tipo nombre [ ];

La declaración se puede hacer:

int[ ] c;

y también se puede expresar

int c[ ];

int es el tipo, se declara un array de números enteros.


c es el nombre del array

El array puede ser una variable local o un atributo. Si el array es un atributo podemos añadir el
modificador de acceso:

modificador_acceso tipo[ ] nombre;


o
modificador_acceso tipo nombre [ ];

Ejemplos:

private int[ ] numeros;


private String[ ] cadenas;

5-57
Tema 9. Arrays

Ejemplo 0: ¿son las siguientes declaraciones equivalentes?

double[] array1, array2; double array1[]; double[] array1;


double array2[]; double[] array2;

¿son equivalentes la declaraciones

int[] a, b, c; int a[], b, c;

Declarar múltiples variables tipo array en una sola declaración puede provocar errores sutiles, como
muestra el anterior ejemplo.

Recomendación:
Mantén cada declaración en una línea separada e incluye un comentario que
describa a la variable que está declarando.

2.2 La inicialización o creación de un array.

Al igual que los demás objetos, los arrays se crean con la palabra clave new, tanto para
arrays que contengan tipos primitivos como para los que contengan tipos complejos. La
sintaxis de la creación de un array es:

Declaración modificador_acceso tipo[ ] nombre;


Creación nombre= new tipo[longitud];
modificador_acceso tipo[ ] nombre= new tipo[longitud];

La longitud es el número de elementos que va a tener el array. Un array tiene una


longitud fija, que se define en su creación.

Ejemplos:

private int[] numeros = new int[5];

private String[] cadenas = new String[4];

Los arrays hay que inicializarlos o crearlos para que se puedan utilizar. Un array sin
inicializar (new) no se puede utilizar.

6-57
Tema 9. Arrays

Ejemplo 1. Prueba los siguientes códigos en una clase de Pruebas. ¿Qué se imprime en
la consola?

1) 2)

public static void main(String[] args) { public static void main(String[] args) {
int[] arrayC; int[] arrayC= null;
System.out.println(arrayC); System.out.println(arrayC);
}
}
3)

Declaración y creación de un array


public static void main(String[] args) {
int[] arrayC= new int[12];
System.out.println(arrayC);
}

La siguiente expresión declara y crea un objeto array llamado c, que contiene 12


elementos int.

int[] c= new int[ 12 ];

También puede realizarse en dos pasos, como se muestra a continuación:

int[ ] c; ← declaración
c = new int[ 12 ]; ← creación

Un programa puede crear varios arrays en una sola instrucción, por ejemplo:

String[] b = new String[ 100 ], x = new String[ 27 ];

Por cuestión de legibilidad, es preferible declarar y crear en instrucciones separadas:

String[] b = new string[ 100 ];


String[] x = new string[ 27 ];

2.3 Inicialización de los elementos.

Al crear un array, cada uno de sus elementos recibe un valor predeterminado: cero para
los elementos numéricos de tipos primitivos, false para los elementos boolean y null para
las referencias (cualquier tipo no primitivo). Como pronto veremos, podemos proporcionar
valores iniciales para los elementos al crear un array.

7-57
Tema 9. Arrays

Importante:

Una vez hayamos creado un array, todas sus posiciones son inicializadas al valor
por defecto del tipo de variable que albergue: Es decir, 0 ó 0.0 si se trataba de un
número, false si se trataba de un boolean y null si se trataba de un tipo complejo.

Ejemplo 2. Prueba el siguiente código:

public static void main(String[] args) {


int[] arrayC= new int[12];
arrayC[2]=25;
System.out.println(arrayC[6]);
System.out.println(arrayC[2]);
System.out.println(arrayC[5]+arrayC[11]);
//el contenido del último elemento del arrayC
System.out.println(arrayC[12]);
}

Corrige el cóigo si es necesario

2.4 El nombre del array contiene la dirección de memoria del contenido del array

La expresión anterior

int c[] = new int[ 12 ];

crea un array que contiene 12 elementos int y almacena la referencia del array en la variable c, por
lo tanto, c es una variable que hará referencia a un array de valores int (es decir, c almacenará una
referencia a un objeto array).

En el siguiente ejemplo se representa como queda en memoria un array de tipos primitivos


llamado num.

8-57
Tema 9. Arrays

Con un array de tipos complejos quedaría de la siguiente manera:

Importante.

Un programa puede declarar arrays de cualquier tipo. Cada elemento de un array de tipo
primitivo contiene un valor del tipo declarado. De manera similar, en un array de un tipo de
referencia, cada elemento es una referencia a un objeto del tipo declarado. Por ejemplo, cada
elemento de un array int es un valor int, y cada elemento de un array String es una
referencia a un objeto String.

9-57
Tema 9. Arrays

3 Ejemplos y usos de arrays

3.1 Crear y recorrer un array

Ejemplo3. Declara un array llamado “array” de enteros (los elementos son de tipo entero),
con 10 elementos y muestra su contenido.

La ejecución deberá obtener un resultado similar al siguiente:

Indice Valor
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0

Observa que los elementos del array se han inicializado a un valor automáticamente.

Utiliza una única clase que contenga el método main para realizar el ejemplo.

// Crear y recorrer un array


public class Ejemplo3{

public static void main(String[] args) {


}
}

Importante:
Es imposible acceder a una posición fuera del array en tiempo de ejecución.
Llegado el caso se lanzará una excepción del tipo ArrayIndexOutOfBoundException

Solución

// Crear y recorrer un array


public class Ejemplo3{
public static void main(String[] args) {

int array[]; //declara un array llamado array


array = new int[ 10 ]; // crea el espacio para el array
System.out.printf( "%s%8s\n", "Indice", "Valor" ); //Escribe cabeceras

// imprime el valor de cada elemento del array


for ( int contador = 0; contador < array.length; contador++ )
System.out.printf( "%5d%8d\n", contador, array[ contador ] );
}
}

10-57
Tema 9. Arrays

Ejemplo 4. Igual que el ejemplo anterior, pero realiza el recorrido en orden inverso.

La ejecución obtendrá un resultado similar al siguiente:

Indice Valor
9 0
8 0
7 0
6 0
5 0
4 0
3 0
2 0
1 0
0 0

Solución

// Crear y recorrer un array


public class Ejemplo4 {

public static void main(String[] args) {

int array[]; //declara un array llamado array


array = new int[ 10 ]; // crea el espacio para el array
System.out.printf( "%s%8s\n", "Indice", "Valor" ); //Escribe cabeceras

// imprime el valor de cada elemento del array en orden inverso


for ( int contador = 9; contador >=0 ; contador-- )
System.out.printf( "%5d%8d\n", contador, array[ contador ] );
}
}

11-57
Tema 9. Arrays

3.2 Inicializador de array o lista inicializadora

Un programa puede crear un array e inicializar sus elementos con un inicializador de


array, que es una lista de expresiones separadas por comas (la cual se conoce también
como lista inicializadora) encerrada entre llaves ({ y }); la longitud del array se determina
en base al número de elementos en la lista inicializadora. Por ejemplo, la declaración

int n[ ] = { 10, 20, 30, 40, 50 };

crea un array de cinco elementos denominado n. El elemento n[ 0 ] se inicializa con 10,


n[ 1 ] se inicializa con 20, y así sucesivamente.

Esta declaración no requiere que new cree el objeto array. Cuando el compilador
encuentra la declaración de un array que incluye una lista inicializadora, cuenta el número
de inicializadores en la lista para determinar el tamaño del array y asigna el valor a cada
elemento.

int n[ ] = { 10, 20, 30, 40, 50 }; “detrás de las cámaras”

int n[ ] = new int[5];


int[0]=10;
int[1]=20;
int[2]=30;
int[3]=40;
int[4]=50;

Ejemplo 5. Crea, inicializa y recorre un array llamado array.

El array tiene una longitud de 10 elementos cuyo valor se introduce mediante una lista
inicializadora:

int array[] = { 32, 27, 64, 18, 95, 14, 90, 70, 60, 37 };

Solución
public class Ejemplo5 {

public static void main(String[] args) {

// la lista inicializadora especifica el valor para cada elemento


int array[] = { 32, 27, 64, 18, 95, 14, 90, 70, 60, 37 };
System.out.printf( "%s%8s\n", "Indice", "Valor" );

// imprime el valor del elemento de cada array


for ( int contador = 0; contador < array.length; contador++ )
System.out.printf( "%5d%8d\n", contador, array[ contador ] );
}

12-57
Tema 9. Arrays

Ejemplo 6. Crea un array de 20 elementos y asigna a cada elemento uno de los enteros
pares del 2 al 40 (2, 4, 6, 8, ..., 40).

No utilices una lista inicializadora para asignar los valores a los elementos del array.

Después, la aplicación muestra el array en formato tabular, como en los ejemplos


anteriores.

public class Ejemplo6 {

public static void main(String[] args) {

Ejemplo 7. Crea un array denominado nota de diez elementos, que guarde en cada
elemento una nota (números enteros del 1 al 10) introducida por consola. Después, la
aplicación muestra el array en formato tabular, como en los anteriores ejemplos.

public class Ejemplo7 {

public static void main(String[] args) {

13-57
Tema 9. Arrays

3.3 Suma y otros cálculos de los elementos de un array

A menudo, los elementos de un array representan una serie de valores que se emplearán
en un cálculo.

Ejemplo8. Crea un array de 10 elementos denominado nota. Las notas (números del 1.0
al 10.0) se introducen por el teclado, después, calcula e imprime su media.

Ejemplo9. En el ejemplo 6 del anterior tema hicimos un programa que demostraba que
los números que produce el método nextInt de la clase Random ocurren con una
probabilidad aproximadamente igual, simulamos 6000 tiradas de un dado y guardamos su
frecuencia en seis contadores. ¿Como mejorarías el programa utilizando un array?

El siguiente código representa la solución del ejemplo 6 del tema anterior, mejora el
código utilizando un array.
package tema8;
import java.util.Random;
public class TirarDado {

public static void main(String[] args) {


Random numerosAleatorios = new Random();
int frecuencia1=0; //contador de veces que se tiró 1
int frecuencia2=0;
int frecuencia3=0;
int frecuencia4=0;
int frecuencia5=0;
int frecuencia6=0;
int cara; // almacena el valor de la tirada

for ( int tiro = 1; tiro <= 6000; tiro++ ) {


cara = 1 + numerosAleatorios.nextInt( 6 );
switch ( cara ) {
case 1:
++frecuencia1; // incrementa el contador de 1s
break;
case 2:
++frecuencia2; // incrementa el contador de 2s
break;
case 3:
++frecuencia3; // incrementa el contador de 3s
break;
case 4:
++frecuencia4; // incrementa el contador de 4s
break;
case 5:
++frecuencia5; // incrementa el contador de 5s
break;
case 6:
++frecuencia6; // incrementa el contador de 6s
break; // opcional al final del switch
} // fin de switch
} // fin de for
System.out.println( "Cara\tFrecuencia" ); // encabezados de salida
System.out.printf( "1\t%d\n2\t%d\n3\t%d\n4\t%d\n5\t%d\n6\t%d\n",
frecuencia1, frecuencia2, frecuencia3, frecuencia4,frecuencia5, frecuencia6 );
}

14-57
Tema 9. Arrays

3.4 Algoritmos de búsqueda.

La operación de búsqueda en un array unidimensional o vector consiste en determinar si


el valor buscado está en el array y que posición ocupa.

Los casos que se pueden presentar están en función de que el vector esté o no ordenado
y pueda tener o no, elementos repetidos.

3.4.1 Búsqueda secuencial o lineal en un vector desordenado.

Se recorre secuencialmente el vector hasta encontrar un elemento cuyo valor coincida


con el buscado o hasta que se acabe el vector. En este último caso el algoritmo debe
indicar la no existencia de dicho valor.

En los casos en los que puede aparecer el valor repetido, el algoritmo debe recorrer el
vector hasta el último elemento si se desea conocer cuantas ocurrencias tiene el
elemento.

Ejemplo 10. Guarda en un array 100 números (enteros aleatorios comprendidos entre el 1
y el 100), recorre dicho array y determina si se encuentra el número 5 y si está, determina
también cuantas veces está.

Nota: si no hay elementos repetidos la búsqueda termina cuando se encuentra el


elemento buscado o se llega al final.

3.4.2 Búsqueda secuencial o lineal en un vector ordenado.

Si el orden es ascendente, por ejemplo, una vez sobrepasado el valor buscado no es


necesario recorrer el resto del vector para saber que el valor no existe.

Ejemplo11. El array números guarda la siguiente secuencia de números enteros


ordenados comprendidos entre el número 1 y el número 50:

int numeros[] = { 2, 5, 6, 7, 8, 9, 10, 11, 12, 15, 18, 19, 20, 30, 33, 35, 36, 39, 40, 42, 50}

Crea e inicializa el array, y en el mismo programa pide al usuario que introduzca un


número, el programa buscará dicho número en el array devolviendo si existe su posición,
es decir, el índice del elemento del array donde se encuentra el número buscado.

15-57
Tema 9. Arrays

3.4.3 Búsqueda binaria o dicotómica

Este algoritmo es valido exclusivamente para vectores ordenados y consiste en comparar


en primer lugar con el elemento central del vector, y si no es igual al valor buscado se
reduce el intervalo de búsqueda, la mitad en la cual el valor no puede estar es eliminada.

Ejemplo, vector “v” ordenado ascendentemente.

A B H J K M P R T W

0 9

Algoritmo:

izq=0
der=9 (v.length-1)

cen= (izq+der)/2 (división entera)

si v[cen]=valor
elemento encontrado.
sino
si valor> v[cen]
izq=cen+1
sino
der=cen-1

fin_si
fin_si

La búsqueda finalizará:

Cuando se encuentra el valor buscado.

El tramo de búsqueda se reduce hasta el punto de quedar anulado, es decir, izq > der.

16-57
Tema 9. Arrays

Algoritmo de BusquedaDicotomica
izq, cen, der: variables numéricas enteras.
letra [50]: un array de caracteres de 50 elementos
valor: carácter

Cargar el vector letra, orden ascendete

izq=0
der=letra.length -1
cen = ( izq+der)/2
escribir “Deme el elemento que desea buscar”
leer valor

mientras letra[cen]<> valor && izq<der

si valor>letra[cen]
izq=cen+1
sino
der=cen-1
fin_si
cen=(izq+der)/2

fin_mientras

si valor=letra[cen]
escribir “Elemento encontrado en la posición”, cen
sino
escribir “No existe el valor buscado”
fin_si

Fin_Algoritmo

Ejemplo12. El array números guarda la siguiente secuencia de números enteros ordenados


comprendidos entre el número 1 y el número 50:

int numeros[ ] = { 2, 5, 6, 7, 8, 9, 10, 11, 12, 15, 18, 19, 20, 30, 33, 35, 36, 39, 40, 42, 50}

Crea e inicializa el array, y en el mismo programa pide al usuario que introduzca un número, el
programa buscará dicho número en el array devolviendo si existe su posición, es decir, el índice
del elemento del array donde se encuentra el número buscado. Utiliza el algoritmo de la
búsqueda dicotómica.

17-57
Tema 9. Arrays

3.5 Algoritmos de ordenación

La ordenación puede ser:


-Ascendente
-Descendente

Existen varios algoritmos de ordenación, pero sólo estudiaremos el algoritmo de ordenación por
intercambio o de la burbuja.

Método de la Burbuja

Consiste en recorrer sucesivamente el vector comparando los elementos consecutivos e


intercambiándolos cuando estén descolocados.

El recorrido del vector se hace para la ordenación ascendente de izquierda a derecha


desplazando los valores mayores a la derecha. En cada pasada o vuelta colocamos con seguridad
un elemento. Por este motivo el número de comparaciones en cada pasada disminuye en 1.

Secuencia Inicial:

v[0] v[1] v[2] v[3]


9 7 4 3

Para intercambiar la posición de dos elementos del vector usamos una variable auxiliar:
aux=v[i]
v[i]=v[i+1]
v[i+1]=aux

SECUENCIA INICIAL 9 7 4 3

v[0] v[1] v[2] v[3]

1ª PASADA 1ª comparación (v[0]>v[1]) 7 9 4 3


2ª comparación (v[1]>v[2]) 7 4 9 3
3ª comparaciones (última v[2] > v[3]) 7 4 3 9

2ª PASADA 1ª comparación (v[0]>v[1]) 4 7 3 9


2ª comparaciones (última v[1] > v[2]) 4 3 7 9

3ª PASADA 1ª comparación (última v[0] > v[1]) 3 4 7 9

En cada PASADA se coloca al menos un elemento del vector

Número de pasadas y comparaciones:

PASADAS < longitud del vector


COMPARACIONES < longitud del vector – PASADAS

18-57
Tema 9. Arrays

Algoritmo Burbuja // Ordenación ASCENDENTE

notas[100]: array de números enteros


<Carga del vector>
pas: variable numérica entera
ele: variable numérica entera
aux: variable numérica entera

para (pas=1;pas<notas.longitud;pas=pas+1)

para( elem=0;ele<notas.longitud-pas;ele=ele+1)

si notas[ele]>notas[ele+1]
aux=nota[ele]
nota[ele]=nota[ele+1]
nota[ele+1]=aux
fin_si

fin_para

fin_para

Fin_Algortimo

Ejemplo 13.

Realiza el siguiente programa:

• Define un vector de 100 elementos enteros.


• Carga el vector con números aleatorios comprendidos entre el valor 1000 y 2000
(ambos inclusive).
• Muestra el vector cargado escribiendo su contenido en filas de 10 elementos cada
una.
• Ordena el vector en forma descendente.
• Muestra el vector ordenado escribiendo su contenido en filas de 10 elementos cada
una.

Si utilizas la programción modular, el programa es más sencillo y fácil de mantener.


https://es.wikipedia.org/wiki/Programaci%C3%B3n_modular

19-57
Tema 9. Arrays

Una mejora del método de la burbuja consiste en detectar cuando el vector está ordenado
y dejar, entonces, de hacer pasadas.

Secuencia Inicial:

v[0] v[1] v[2] v[3]


3 7 4 9

La variable sw detecta el intercambio(0, se ha producido intercambio. 1,no hay


intercambio)

sw=0

Antes de realizar un bucle de PASADAS se evalua el valor de sw.

v[0] v[1] v[2] v[3]

----------------------------------
sw=1
1ª PASADA 3 7 4 9
3 4 7 9 sw=0 //se ha producido un intercambio
3 4 7 9

----------------------------------
sw=1
2ª PASADA 3 4 7 9
3 4 7 9 no hay intercambio.

No son necesarias más pasadas porque en la última pasada no se ha producido


ningún intercambio.

20-57
Tema 9. Arrays

Algoritmo Burbuja_Mejorada // Ordenación ASCENDENTE

<Carga del vector>


pas: variable numérica entera
ele: variable numérica entera
aux: variable numérica entera
sw: variable lógica
sw=true
notas[100]: array de números enteros

para (pas=1;pas<notas.longitud && sw=true;pas=pas+1)

sw=false

para( elem=0;ele<notas.longitud-pas;ele=ele+1)

si notas[ele]>notas[ele+1]
aux=nota[ele]
nota[ele]=nota[ele+1]
nota[ele+1]=aux
sw=true
fin_si

fin_para

fin_para

Fin_Algortimo

Ejemplo 14. Modifica el ejemplo anterior para añadir la mejora en el algoritmo de


ordenación.

21-57
Tema 9. Arrays

3.6 Actualización de un array

La operación de actualización sobre una array unidimensional o vector supone el poder


realizar sobre el array tres tipos de operaciones diferentes:

1- Añadir un nuevo elemento

2- Insertar un nuevo elemento en una posición determinada

3- Borrar un elemento ya existente

Tenemos que tener en cuenta que el array representa una estructura de datos estática, no
puede crecer, ni disminuir en tiempo de ejecución.

La actualización se deberá realizar sin dejar huecos, todos los elementos ocuparán
posiciones contiguas.

1. Añadir un nuevo elemento

Esta operación consiste en añadir un nuevo elemento a continuación del último


almacenado.

El vector no se debe encontrar lleno.

Un posible algoritmo:

int libre=0 //indica la posición del primer elemento libre del array

si (libre <nombreArray.length)
añadir elemento en la posición libre
libre++ //actualizamos la nueva posición libre
sino
escribir un mensaje que indique que el vector esta lleno

22-57
Tema 9. Arrays

2. Insertar un nuevo elemento en una posición determinada

Esta operación consiste en introducir un nuevo elemento en una posición intermedia del
vector, para lo cual es necesario desplazar una posición a la derecha todos aquellos
elementos partiendo de la posición en la queremos insertar el nuevo dato.

Para realizar esta operación el vector no debe encontrarse lleno.

Un posible algoritmo:

si el vector no esta lleno (libre<nota.length)


Pedir la posición en donde se desea insertar el elemento
Desde el último elemento (libre-1) asignar su valor al siguiente elemento,
hasta la posición del elemento a insertar.
Añadir un elemento en la posición en la que se desea insertar
Actualizamos el valor de libre
sino
Vector lleno. No se pueden añadir nuevos elementos

Borrar un elemento

Si se elimina un elemento que se encuentra en una posición intermedia del vector, se


debe desplazar todos los elementos situados a la derecha del elemento que queremos
eliminar una posición a la izquierda y asignar al último elemento null o el valor por defecto
según el tipo de dato del array.

También se puede entender el borrado como un proceso “lógico”, como igualar a 0, a null,
a -1, etc las posiciones que no se quieran borrar sin desplazar los elementos,
dependiendo de la lógica que necesite el programa o de la propia elección del
programador.

Un posible algoritmo:

Comprobar que el vector no esta vacío


Introduce la posición del elemento que se se desea borrar
leer posicion
si posicion es la ultima del vector
se asigna el valor por defecto que indica que esta vacía la
posición
sino
se asigna el siguiente elemento a la posición que se desea
borrar, y se recolocan el resto de elementos del vector
se asigna el valor por defecto que indica que esta vacía la
posición al último elemento
fin_si
disminuir libre

23-57
Tema 9. Arrays

Ejemplo 15. Realiza un programa que nos permita mediante un menú:

A.- Añadir una nota


B.- Borrar una nota
C.- Insertar una nota
D.- Salir de la aplicación

en un vector llamado nota de 10 elementos de tipo entero.

Comprueba que el usuario introduce una de las opciones correctas (A, B, C o D).

Consideraciones:
- Antes de añadir ningún elemento el vector se encuentra vacío.
- Si se intenta añadir o insertar un nuevo elemento en el vector lleno, el programa
tiene que devolver: “Error, vector lleno”
- Si se intenta borrar un elemento en el vector vacío, el programa tiene que
devolver: “Error, vector vacío”

- Utiliza metodología Top-down ('de arriba abajo')


- No utiliza POO. Crea la clase ArrayActualizacion:

Descripción de los atributos:

nota: es el identificador del array de 10 valores enteros.


numeroLibre: guarda la posición del primer elemento libre. Se deberá inicializar a
cero y cambiar según proceda.
posicion: se utiliza para guardar la posición en donde se desea insertar un
nuevo elemento (“Introduce la posición donde se desea insertar la
nota: “) y para la posición del elemento que se desea eliminar
(“Introduce la posición del elemento que se se desea borrar”).

24-57
Tema 9. Arrays

Ejemplo de ejecución, valor inicial (-1):


Posición 0 1 2 3 4 5 6 7 8 9
Valor -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

A. Añadir un elemento
B. Borrar un elemento
C. Insertar un elemento
D. Salir de la aplicación
Elegir opción:

El vector se ha cargado con valor inicial -1, un valor fuera del rango de las posibles notas.

A tener en cuenta: la clase Scanner no tiene un método para leer un carácter, se tendrá
que leer un String. Tienes que buscar un método de la clase String que devuelva el
primer carácter de la cadena (String).

Aquí tienes algunos enlaces sobre la clase String

http://www.javaya.com.ar/detalleconcepto.php?codigo=100&inicio=20

http://www.sc.ehu.es/sbweb/fisica/cursoJava/fundamentos/clases1/string.htm

http://puntocomnoesunlenguaje.blogspot.com.es/2013/02/clase-string.html

25-57
Tema 9. Arrays

4 Instrucción for mejorada. Sentencia for/in

En los ejemplos anteriores hemos utilizado la instrucción for controlada por un contador
para iterar a través de los elementos en un array.

La instrucción for mejorada (Java SE 5.0), conocida también “for extendido” o “for each”,
itera a través de los elementos de un array o colección sin utilizar un contador (con lo
cual, evita la posibilidad de “salirse” del array).

La sintaxis de una instrucción for mejorada es:

for ( parámetro : nombreArray ) {


instrucción1 ;
….
instrucciónN;
}

En donde:
- parámetro tiene dos partes: un tipo y un identificador (por ejemplo, int numero). El
tipo del parámetro debe concordar (o poder promocionar 1) con el tipo del array.

- nombreArray es el array a través del cual se iterará.

Ejemplo

int[ ] nota=new int[15] // nota es un array de números enteros


// recorre el array nota
for (int i: nota){
System.out.pintln(i);
}

1 Recuerda las conversiones a tipos más grandes: conversiones implícitas y permitidas.

26-57
Tema 9. Arrays

Ejemplo 16 Copia y prueba el siguiente ejemplo.


public class Ejemplo16 {

public static void main(String[] args) {


int array[] = { 87, 68, 94, 100, 83, 78, 85, 91, 76, 87 };

for ( int numero : array ) {


System.out.printf("Valores del vector: %5d\n",numero);
}
}
}

El tipo del parámetro para el for mejorado es int, ya que array contiene valores int; la
instrucción for selecciona un valor int del array por cada iteración, el número de
iteraciones es igual al número de elementos del array.

La instrucción for mejorada itera a través de valores sucesivos en el array, uno por uno. El
encabezado del for mejorado se puede leer como “para cada iteración, asignar el
siguiente elemento del array a la variable numero”.

Por lo tanto, para cada iteración, el parámetro “numero” representa un elemento del array.

La instrucción for mejorada simplifica el código para iterar a través de un array. No


obstante, observa que la instrucción for mejorada sólo puede utilizarse para obtener
elementos del array; no puede utilizarse para modificar los elementos.

La instrucción for mejorada se puede utilizar en lugar de la instrucción for controlada por
contador, cuando el código que itera a través de un array no requiere acceso al contador
que indica el índice del elemento.

Si el programa necesita modificar elementos o tener acceso al índice, se debe usar


la instrucción for controlada por contador.

Ejemplo 17. Utilizando la instrucción “for mejorada” realiza una aplicación que obtenga la
media aritmética del array del ejemplo 16.

public class Ejemplo17 {

public static void main(String[] args) {


int array[] = { 87, 68, 94, 100, 83, 78, 85, 91, 76, 87 };


}
}

27-57
Tema 9. Arrays

5.-Paso de arrays a los métodos. Notas acerca del paso de argumentos a los métodos.

Una variable de tipo array, por ejemplo num

int [ ] num = new int[3];

guarda la referencia (dirección) al array, no el array (contenido).

Cuando pasamos un array a un método lo que pasamos es la referencia a dicho array, no


su contenido.

Nota: Pasar la referencia al array en lugar de su contenido mejora el rendimiento de las


aplicaciones. Si los arrays se pasaran por valor, se pasaría una copia de cada elemento.
En los arrays grandes que se pasan con frecuencia, esto desperdiciaría tiempo y
consumiría una cantidad considerable de almacenamiento.

28-57
Tema 9. Arrays

Ejemplo 18. El siguiente ejemplo ilustra el paso de un array a un método.

Define una variable de tipo array de enteros: array1.

El método modificarArray recibe una copia de la referencia a array1 en el parámetro


array2 y modifica los elementos de array2 duplicando el valor de cada elemento.

Para demostrar que se modificaron los elementos del array1, se imprime en pantalla los
cinco elementos de array1 antes de llamar al método y después.

Una observación adicional: en el método modificarArray no se puede usar la instrucción


for mejorada, ya que estamos modificando los elementos del array.

public class Ejemplo18 {

public static void main(String[] args) {


int[] array1 = { 1, 2, 3, 4, 5 };
System.out.println(
"Efectos de pasar una referencia a un array completo:\n" +
"Los valores del array original son:" );
for ( int valor : array1 ){
System.out.printf( " %d", valor );
}

modificarArray( array1 );

System.out.println( "\n\nLos valores del array modificado son:" );


for ( int valor : array1 ){
System.out.printf( " %d", valor );
}
}// fin de main

public static void modificarArray( int[] array2 ){


for ( int i=0; i < array2.length; i++ )
array2[ contador ] *= 2;
}

Observación:

Todo objeto array “conoce” su propia longitud (a través de su campo length).

Muy importante:

Cualquier modificación que se realice usando el parámetro array2 se lleva a cabo


en el argumento array1, ya que array1 y array2 guardan la referencia de la misma
tabla.

29-57
Tema 9. Arrays

Debemos diferenciar el paso a un método de un array o el paso a un método de un


elemento del array.

Ejemplo 19. Pasar un elemento de un array de tipo primitivo.

El programa demuestra que cuando se pasa una copia de un elemento de un array de tipo
primitivo (argumento) a un método, y se modifica su valor (parámetro) el elemento
original del array no se ve afectado.

El método modificarElemento multiplica por 2 el valor recibido y almacena el resultado en


su parámetro.

Recuerda:
Los parámetros de los métodos, al igual que las variables locales, dejan de existir
cuando el método en el que se declaran termina su ejecución.

public class Ejemplo19 {

public static void main(String[] args) {


int array[] = { 1, 2, 3, 4, 5 };

System.out.printf(
"\n\nEfectos de pasar el valor de un elemento del array:\n" +
"array[3] antes de modificarElemento: %d\n\n", array[ 3 ]);

modificarElemento( array[ 3 ] );

System.out.printf(
"array[3] después de modificarElemento: %d\n", array[ 3 ] );
}

public static void modificarElemento( int elemento ) {


elemento *= 2;
System.out.printf("Valor del elemento en modificarElemento: %d\n\n",
elemento );
}

No obstante, se debe realizar la siguiente consideración:

No es lo mismo pasar un elemento de un array de tipo primitivo que un elemento


de un array de tipo complejo. El tipo no primitivo o complejo, también se conoce
como tipo referencia. Ya sabes que un objeto, en realidad es una referencia a un
objeto. Si el método modifica cualquier atributo del objeto (parámetro), el elemento
del array de tipo objeto (argumento) que se ha pasado al método también se
modifica, ya que en realidad argumento y parámetro refrencian el mismo objeto.

30-57
Tema 9. Arrays

Notas acerca del paso de argumentos a los métodos

En muchos lenguajes de programación existen dos formas de pasar argumentos en las


llamadas a métodos son el paso por valor y el paso por referencia (también conocidas
como llamada por valor y llamada por referencia).

Cuando se pasa un argumento por valor, se pasa una copia del valor del argumento al
método que se llamó. Este método trabaja exclusivamente con la copia. Las
modificaciones a la copia del método que se llamó no afectan el valor de la variable
original en el método que hizo la llamada.

Cuando se pasa un argumento por referencia, el método que se llamó accede al valor del
argumento a través de la referencia, y puede modificar su valor. El paso por referencia
mejora el rendimiento, al eliminar la necesidad de copiar cantidades de datos
posiblemente extensas.

A diferencia de otros lenguajes, Java no permite a los programadores elegir el paso por
valor o el paso por referencia; todos los argumentos se pasan por valor. Ahora bien,
una llamada a un método puede pasar dos tipos de valores:

- Copias de valores primitivos (como valores de tipo int y double).

Cuando un método modifica un parámetro de tipo primitivo, las modificaciones a


ese parámetro no tienen efecto en el valor original del argumento en el método que
hizo la llamada.

- Copias de referencias a objetos, incluyendo las referencias a un array.

Aunque la referencia a un objeto se pasa por valor, un método puede de todas


formas interactuar con el objeto al que se hace referencia, llamando a sus métodos
public mediante el uso de la copia de la referencia al objeto.

Como la referencia almacenada en el parámetro es una copia de la referencia que


se pasó como argumento, el parámetro en el método que se llamó y el argumento
en el método que hizo la llamada hacen referencia al mismo objeto. En este tema lo
estamos estudiando con los arrays pero pasa exactamente igual con cualquier
valor de tipo referencia.

31-57
Tema 9. Arrays

Ejemplo 20. Ejemplo POO con un clase que define un array como atributo.

Crea la clase LibroCalificaciones con un array para almacenar las calificaciones y la clase
PruebaLibroCalificaciones según se indica.

La clase LibroCalificaciones tiene dos atributos: el nombre de una asignatura y un array


de enteros para guardar las calificaciones de varios estudiantes en esa asignatura.

El constructor de la clase tiene dos parámetros: el nombre de la asignatura y un array de


calificaciones.

Un objeto de tipo LibroCalificaciones representa una asignatura determinada y sus


calificaciones.

LibroCalificaciones
- nombreAsignatura: String
- calificaciones[]: int
<constructor>LibroCalificaciones(nombre: String, arrayCalif: int[])
+ setNombreAsignatura(nombre: String)
+ getNombreAsignatura():String
+ mostrarMensaje()
+ imprimirCalificaciones()
+ procesarCalificaciones()
- obtenerMinima(): int
- obtenerMaxima(): int
- obtenerPromedio(): double

El método mostrarMensaje muestra el siguiente mensaje de bienvenida:

Bienvenido al libro de calificaciones para


Bases de Datos!

El método imprimirCalificaciones muestra las notas de todos los estudiantes, ver ejemplo
de ejecución.

El método procesarCalificaciones realiza una serie de cálculos sobre los datos llamando
secuencialmente a los métodos:

- obtenerPromedio() // devuelve el promedio de las calificaciones


- obtenerMinima() // devuelve la calificación más baja
- obtenerMaxima() // devuelve la calificación más alta

Ver ejemplo de ejecución.

32-57
Tema 9. Arrays

La clase PruebaLibroCalificaciones

La clase PruebaLibroCalificaciones (aplicación) crea un objeto de la clase


LibroCalficaciones pasando al constructor los datos del nombre de la asignatura y sus
calificaciones. Estos datos los debe introducir el usuario que ejecuta la aplicación
mediante el teclado.

Al usuario se le debe preguntar por el número de alumnos de la asignatura. La aplicación


deberá comprobar la entrada de califcaciones correctas, valores entre 0 y 10.

Después de pasar estos datos al constructor de la clase para instanciar el objeto, la


aplicación utiliza el objeto para probar sus métodos. La siguiente figura ilustra un ejemplo
de ejecución.

Bienvenido al libro de calificaciones para


Bases de Datos!

Las calificaciones son:

Estudiante 1: 8
Estudiante 2: 6
Estudiante 3: 4
Estudiante 4: 0
Estudiante 5: 3
Estudiante 6: 8
Estudiante 7: 5
Estudiante 8: 1
Estudiante 9: 7
Estudiante 10: 5

El promedio de la clase es 4,70


La calificación más baja es 0
La calificación más alta es 8

La aplicación deberá obtener una salida como la indicada.

33-57
Tema 9. Arrays

6 Arrays multidimensionales

Los arrays multidimensionales de dos dimensiones se utilizan con frecuencia para


representar tablas de valores ordenados en filas y columnas. Para identificar un elemento
específico de una tabla, debemos especificar dos índices. Por convención, el primero
identifica la fila del elemento y el segundo su columna.

Los arrays que requieren dos índices para identificar un elemento específico se llaman
array bidimensionales (los array multidimensionales pueden tener más de dos
dimensiones).

La siguiente figura ilustra un array bidimensional llamado a, que contiene tres filas y
cuatro columnas (es decir, un array de tres por cuatro). En general, a un array con m filas
y n columnas se le llama array de m por n.

Nombre de la tabla o array: a


Dimensión del array 3 x 4 (3 filas, 4 columnas)

Columna 0 Columna 1 Columna 2 Columna 3


Fila 0 a[ 0 ][ 0 ] a[ 0 ][ 1 ] a[ 0 ][ 2 ] a[ 0 ][ 3 ]
Fila 1 a[ 1 ][ 0 ] a[ 1 ][ 1 ] a[ 1 ][ 2 ] a[ 1 ][ 3 ]
Fila 2 a[ 2 ][ 0 ] a[ 2 ][ 1 ] a[ 2 ][ 2 ] a[ 2 ][ 3 ]

Declaración del array a:

int a[ ][ ] = new int[ 3 ][ 4 ];

nº de columnas

nº de filas

Todas las celdas (elementos) deben tener el mismo tipo de contenido o lo que es lo
mismo, cada elemento de la tabla bidimensional es de un determinado tipo primitivo o tipo
complejo.

34-57
Tema 9. Arrays

Ejemplo de un array de 4 filas y 5 columnas.

Se define un array de enteros llamado twoD de 4 filas y 5 columnas.

int twoD [ ] [ ] = new int [4] [5]

35-57
Tema 9. Arrays

En un array bidimensional se puede guardar (estructurar) información diversa. Por


ejemplo, el importe bruto de las ventas de 5 comerciales en los doce meses del año
anterior, las notas de 20 alumnos en 6 asignaturas, el estado de una vivienda (vendida o
no vendida) en una promoción de viviendas de 7 bloques, de 9 plantas y de 4 viviendas
por planta.

Ejercicio : define los tres arrays bidimensionales (descritos anteriormente) con un nombre
significativo y de un tipo que nos permita guardar la información requerida.

double [ ][ ] ventasImporte = new double [5] [13];

int [][] notas= new int [20][6];

boolean [ ][ ] [ ] vivienda = new boolean [7] [9] [4]

Los arrays multidimensionales también pueden inicializarse mediante inicializadores de


arrays, por ejemplo, un array bidimensional b con dos filas y dos columnas podría
declararse e inicializarse con inicializadores de arrays anidados, como se muestra a
continuación:

int b[ ] [ ] = { { 1, 2 }, {3, 4} }; int b[ ] [ ] = new int [2] [2];


b [0][0]=1;
b [0][1]=2;
b [1][0]=3;
b [1][1]=4;

1 2
3 4

36-57
Tema 9. Arrays

Ejemplo 21. Crea e inicializa con una lista de valores las tablas array1 y array2 según los
siguientes valores:

Valores en array1 por filas

123
456

Valores en array2 por filas

129
310
456

Y muestra su contenido por filas.

Ejemplo 22. Crea e inicializa con una lista de valores la tabla array2 según los siguientes
valores:

129
310
456

Muestra el contenido de la diagonal principal y secudaria.

Ejemplo 23. Crea e inicializa con una lista de valores la tabla array2 según los siguientes
valores:

129
310
456

Obten los valores del array (fila, columna y valor) superiores a la media de todos los
elementos del array.

37-57
Tema 9. Arrays

Ejemplo 24. La matriz A tiene los siguientes valores:

3 4 5 7 15
6 4 5 6 9

Y la matriz B:

2 1 5 7 1
2 4 5 0 9

Crear una matriz C que represente la suma de las dos matrices.

Escribir su contenido.

Ejemplo 25. Crea e inicializa con una lista de valores las tablas array1 y array2 según los
siguientes valores:

Valores en array1 por filas

123
456

Valores en array2 por filas

129
310
456

Muestra su contenido desde un método. Tienes que pasar al método la referencia del
array, el número de filas y columnas

38-57
Tema 9. Arrays

Un array bidimensionales es un array de arrays unidimensionales.

int [ ] [ ] M= new int [3] [5];

en realidad es:

39-57
Tema 9. Arrays

Arrays bidimensionales con filas de distintas longitudes

Java permite crear arrays con filas de distinta longitud(distinto número de columnas).

Ejemplo:

int b[ ][ ] = { { 1, 2 }, { 3, 4, 5 } };

Crea el array entero b con dos elementos que representan las filas del array
bidimensional.

Cada fila de b es una referencia a un array unidimensional de variables int.

- El array int de la fila 0 es un array unidimensional con dos elementos (1 y 2)


- El array int de la fila 1 es un array unidimensional con tres elementos (3, 4 y 5).

fila 0 1 2
fila 1 3 4 5

También se puede declarar un arrays bidimensional con filas de distintas longitudes sin
utilizar listas inicializadoras, por ejemplo:

int b[ ][ ] = new int[ 2 ][ ]; // crea 2 filas

b[ 0 ] = new int[ 5 ]; // crea 5 columnas para la fila 0


b[ 1 ] = new int[ 3 ]; // crea 3 columnas para la fila 1

Estas instrucciones crean un array bidimensional con dos filas. La fila 0 tiene cinco
columnas y la fila 1 tiene 3 columnas.

40-57
Tema 9. Arrays

Ejemplo 22. Copia, ejecuta e interpreta el siguiente programa

public class Ejemplo22 {


public static void main( String args[] ) {
int array1[][] = { { 1, 2, 3 }, { 4, 5, 6 } };
int array2[][] = { { 1, 2 }, { 3 }, { 4, 5, 6 } };
System.out.println( "Los valores en array1 por filas son" );
imprimirArreglo( array1 ); // muestra array1 por filas
System.out.println( "\nLos valores en array2 por filas son" );
imprimirArreglo( array2 ); // muestra array2 por filas
}

// imprime filas y columnas de un arreglo bidimensional


public static void imprimirArreglo( int arreglo[][] ) {

for ( int fila = 0; fila < arreglo.length; fila++ ) {

for (int columna = 0; columna < arreglo[ fila ].length;columna++){


System.out.printf( "%d ", arreglo[ fila ][ columna ] );
}// fin for interno
System.out.println(); // inicia nueva línea de salida
} //fin for externo
}

41-57
Tema 9. Arrays

7 Listas de argumentos de longitud variable

Con las listas de argumentos de longitud variable podemos crear métodos que reciben un
número arbitrario de argumentos.

Un tipo de argumento que va precedido por “...” en la lista de parámetros de un


método indica que éste recibe un número variable de argumentos de ese tipo específico.

La especificación de “...” puede ocurrir sólo una vez en una lista de parámetros y debe
colocarse al final de la lista.

La codificación de este tipo de argumento es el siguiente: tipo … nombre

42-57
Tema 9. Arrays

Ejemplo 23. Interpreta el siguiente código:

public class Ejemplo23 {


public static void main( String args[] ) {
double d1 = 10.0;
double d2 = 20.0;
double d3 = 30.0;
double d4 = 40.0;
System.out.printf( "d1 = %.1f\nd2 = %.1f\nd3 = %.1f\nd4 = %.1f\n\n",
d1, d2, d3, d4 );
System.out.printf( "El promedio de d1 y d2 es %.1f\n",
promedio( d1,d2 ) );
System.out.printf( "El promedio de d1, d2 y d3 es %.1f\n",
promedio( d1, d2, d3 ) );
System.out.printf( "El promedio de d1, d2, d3 y d4 es %.1f\n",
promedio( d1, d2, d3, d4 ) );
} // fin de main
/* calcula el promedio: sobre Carga de Métodos
public static double promedio( double numero1, double numero2 ){
double total = (numero1+numero2)/2;
return total;
}
public static double promedio( double numero1, double numero2,double numero3 ){
double total = (numero1+numero2+numero3)/3;
return total;
}
public static double promedio( double numero1, double numero2,
double numero3, double numero4 ){
double total = (numero1+numero2+numero3+numero4)/4;
return total;
}
*/
// calcula el promedio: lista de argumentos de longitud variable
public static double promedio( double... numeros ) {
double total = 0.0; // inicializa el total
// calcula el total usando la instrucción for mejorada
for ( double d : numeros ){
total += d;
}
// for (int i=0; i<numeros.length; i++){
// total += numeros[i];
// }

return total / numeros.length;

}
}

Salida del programa:

d1 = 10,0
d2 = 20,0
d3 = 30,0
d4 = 40,0

El promedio de d1 y d2 es 15,0
El promedio de d1, d2 y d3 es 20,0
El promedio de d1, d2, d3 y d4 es 25,0

43-57
Tema 9. Arrays

8. Uso de argumentos de línea de comandos

Es posible pasar argumentos desde la línea de comandos a una aplicación, para lo cual
se incluye un parámetro de tipo String[ ] (es decir, un array de cadenas) en la lista de
parámetros de main:

public static void main( String args[ ] )

Por convención, a este parámetro se le llama args. Cuando se ejecuta una aplicación
usando el comando java, Java pasa los argumentos de línea de comandos que aparecen
después del nombre de la clase.

El número de argumentos que se pasan desde la línea de comandos se obtiene


accediendo al atributo length del array args.

Por ejemplo, el comando "java miClase a b" pasa dos argumentos de línea de
comandos, a y b, a la aplicación miClase. Los argumentos de la línea de comandos se
separan por espacio en blanco, no por comas. Cuando se ejecuta este comando, el
método main de MiClase recibe los argumentos en los parametros :

args[ 0 ] contiene el objeto String "a"


args[ 1 ] contiene el objeto String "b"

y el valor del atributo length de args es igual a 2 (args.length = 2).

Ejemplo 24. Utiliza un argumento de linea de comando para dimensionar un array llamado
numero de tipo entero. El array numero es una variable local del método main.

Los argumentos de línea de comandos se reciben en un array llamado args de objetos


String. El método static parseInt de la clase Integer convierte su argumento String en un
int.

Copia y Ejecuta:

public class Ejemplo24 {


public static void main( String args[] ){
// obtiene el tamaño del array de un argumento de línea de comandos
int longitudArray = Integer.parseInt( args[ 0 ] );
int numero[] = new int[ longitudArray ];
for ( int i = 0; i < numero.length; i++ )
System.out.printf( "%5d%8d\n", i, numero[ i ] );
}
}

En Eclipse para especificar argumentos de línea de comandos ejecuta el programa con la


opción Run Configurations, selecciona la pestaña Arguments y en el cuadro de texto
Program Arguments, escribe los argumentos.

44-57
Tema 9. Arrays

Ejemplo 26. Escribe una aplicación que utilice 3 argumentos de línea de comando para
definir e inicializar un array llamado pepe de tipo entero.

La dimensión del array la determina el primer argumento de la línea de comando.

El valor del primer elemento del array lo determina el segundo argumento de línea de
comando.

El valor del segundo elemento del array es igual al valor del primer elemento más un
incremento que lo determina el tercer argumento de línea de comandos.

El valor del tercer elemento del array y sucesivos, si los hubiera, lo determina el valor del
anterior elemento más el citado incremento.

Argumentos:

1º Especifica el tamaño del array


2º El valor del primer elemento del array.
3º Incremento.

El programa debe comprobar que se han introducido 3 argumentos, avisando, si procede


del error y terminando su ejecución. En caso contrario, el programa dimensionará la tabla
e introducirá el contenido correspondiente en cada elemento, y por último, mostrará el
contenido del array.

Ejemplo 27. Desarrollar una aplicación que ordene y muestre por pantalla una serie de
números introducidos como argumentos de programa. La aplicación tiene que mostrar la
entrada sin ordenar y ordenada.

Nota: Realiza la ordenación mediante el método de la burbuja.

45-57
Tema 9. Arrays

Ejercicios

1. Letra DNI.

Realiza un programa que reciba por la entrada estándar un número de DNI y devuelva por
la salida estándar la letra del DNI.

Algoritmo de cálculo del DNI


Usamos nuestro numero de DNI y le aplicamos la operación “Modulo 23” . El número
obtenido, se busca su correspondencia en esta tabla, y de ahí obtenemos la letra.

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
T R W A G M Y F P D X B N J Z S Q V H L C K E

No se utilizan las letras: I, Ñ, O, U

ENTRADA: Un número de DNI (Entero positivo de 8 cifras).

12345678

SALIDA: Letra del DNI en mayúsculas.

46-57
Tema 9. Arrays

2. Juego Tres en raya.

https://es.wikipedia.org/wiki/Tres_en_l%C3%ADnea

Realiza una clase que ejecute el juego de las tres en raya entre dos jugadores: X y O,
que marcan los espacios de un tablero de 3×3 alternadamente. Un jugador gana si
consigue tener una línea de tres de sus símbolos: la línea puede ser horizontal, vertical o
diagonal.

Debe imprimir el array al comienzo del juego, el tablero se rellena con el carácter '-'.

Comienza el juego: las posiciones coinciden con el índice de un array de 3X3


- - -
- - -
- - -

Solicita al jugador de 'X' una posición donde colocar la primera ficha:

Introduce coordenadas, tirada: 1. Turno: X


Fila (0, 1 y 2):
0
Columna (0, 1 y 2):
0

A continuación imprime el resultado de la tirada

X - -
- - -
- - -

Y solicita al jugador de '0' una posición donde colocar su primera ficha e imprime el
resultado de la tirada:

Introduce coordenadas, tirada: 2. Turno: 0


Fila (0, 1 y 2):
2
Columna (0, 1 y 2:
0
X - -
- - -
0 - -

El programa debe realizar como máximo nueve tiradas, comprobar después de la tirada
(la quinta) si se ha producido las tres en raya y mostrar el ganador o el resultado de
empate según proceda. Ver los siguientes ejemplos:

47-57
Tema 9. Arrays

X - -
- X -
0 0 X
Gana: X

X X 0
0 0 X
X 0 X
No hay ganadores

El programa deberá asegurar que el usuario no introduce una posición del tablero invalida
(fuera de índice) y que la posición se encuentra libre ('-').

Utiliza la técnica de programación modular, te aconsejo* que desde el método main se


invoquen los siguientes métodos:

Modifier and Type Method and Description

private static imprimirTablero(char[][] tablero)


void Imprime el contenido del array (tablero de juego)
comprobarTresEnRaya(char[][] tablero, char turno, int x,
int y)
private static
Comprueba después de la tirada si se ha producido tres en raya,
boolean
llamando a los métodos comprobarFila, comprobarColumna y
comprobarDiagonal

private static comprobarColumna(char[][] tablero, char turno, int y)


boolean Verifica que los tres elementos de la columna tienen el mismo valor
comprobarDiagonal(char[][] tablero, char turno, int x, int y)
private static
Verifica que los elementos de la diagonal principal o secundaria tienen
boolean
el mismo valor

private static comprobarFila(char[][] tablero, char turno, int x)


boolean Verifica que los tres elementos de la fila tienen el mismo valor

* Un programa correcto no tiene porque tener los métodos descritos obligatoriamente, crea tu
propia solución al algoritmo que se plantea en el enunciado y utiliza después los métodos descritos
como orientación.

48-57
Tema 9. Arrays

private static void imprimirTablero(char[][]tablero)


Descripción: Imprime el contenido del array (tablero de juego) que se pasa como parámetro

Parameters:
tablero – Array de juego 3X3.

private static boolean comprobarTresEnRaya(char[][] tablero, char turno, int x, int y)


Descripción: Comprueba después de la tirada si se ha producido tres en raya, llamando a los métodos
comprobarFila, comprobarColumna y comprobarDiagonal

Parameters:
tablero- Array de juego 3X3.
turno- Caracter X ó 0 (juega X ó juega 0)
x- Fila
y- Columna

Returns: Un valor boolean: true si se ha producido tres en raya

private static boolean comprobarFila(char[][] tablero, char turno, int x)


Descripción: Verifica que los tres elementos de la fila que se pasa como parámetro (x) tienen el mismo valor
(turno).

Parameters:
tablero- Array de juego 3X3.
turno- Caracter X ó 0 (juega X ó juega 0)
x- Fila

Returns: Un valor boolean: true si se ha producido tres en raya.

private static boolean comprobarColumna(char[][] tablero,char turno,int y)


Verifica que los tres elementos de la columna que se pasa como parámetro (y) tienen el mismo valor (turno).

Parameters:
tablero- Array de juego 3X3.
turno- Caracter X ó 0 (juega X ó juega 0)
y- Columna

Returns: Un valor boolean: true si se ha producido tres en raya.

private static boolean comprobarDiagonal(char[][] tablero,char turno, int x, int y)


Verifica que los elementos de la diagonal principal o secundaria tienen el mismo valor (turno).

Parameters:
tablero- Array de juego 3X3.
turno- Caracter X ó 0 (juega X ó juega 0)
x- Fila
y- Columna

Returns: Un valor boolean: true si se ha producido tres en raya.

49-57
Tema 9. Arrays

3. Promoción de viviendas “Dehesa la Villa”.

En la promoción de viviendas “Dehesa la Villa” se han construido 7 bloques, con 2


escaleras de 9 plantas y 4 viviendas por planta.

Se desea obtener una aplicación que obtenga según menú:

• Un listado de las viviendas libres.


• Un listado de las viviendas vendidas.
• Un listado resumen del total de viviendas libres y vendidas en cada bloque.
• Consultar el estado de una vivienda (libre o vendida), introduciendo el número del
bloque, la escalera, la planta y la vivienda.

Ten en cuenta las siguientes consideraciones:

- Utiliza un array para guardar la información (vendida o libre) de la viviendas de la


promoción.
- Recuerda que un array de elemento booleanos se incializa a false.
- Vamos a considerar que false y true representan que la vivienda esta libre o vendida
respectivamente.
- Evita posibles errores por referencia fuera del array.
- Para probar la ejecución del ejercicio, inicializa el array (antes de la visualización del
menú) con valores booleanos aleatorios.

Realiza su API (Application Programming Interface ), ver Anexo.

50-57
Tema 9. Arrays

Anexo: Documentación del código utilizando Javadoc

https://www.youtube.com/watch?v=b3J7sfdlnpk

https://www.youtube.com/watch?v=1rquQwfUvHc

Es importante documentar el código fuente, para facilitar su mantenimiento y reutilización.

Debemos documentar siempre las clases, los constructores, los métodos y los
atributos, también se pueden documentar bucles y partes de algoritmos que se estimen
oportuno.

Java proporciona una herramienta de documentación: Javadoc, que permite a partir del
código fuente generar la documentación en formato HTML. La documentación así
generada se conoce como API (interfaz de programación de la aplicación) o biblioteca de
la aplicación.

Los comentarios de Javadoc tienen una marca de comienzo (/**) y una marca de fin (*/).
Los comentarios de linea o de bloque no son comentarios Javadoc.

Un comentarios de Javadoc tiene dos partes: una para realizar una descripción y otra en
la que encontraremos etiquetas de documentación. Formato general:

/**
* Descripción principal (texto/HTML)
*
* Etiquetas de documentación (texto/HTML)
*/

51-57
Tema 9. Arrays

Ejemplo de un Javadoc de un método.


/**
* Comprueba después de la tirada si se ha producido tres en raya, llamando a los
* métodos: comprobarFila, comprobarColumna y comprobarDiagonal, este último sólo
* si la última tirada es una posición de la diagonal principal o secundaria
* @param tablero- array de juego 3X3
* @param turno- juega X ó juega 0
* @param x- fila
* @param y- columna
* @return un valor boolean: true si se ha producido tres en raya
*/

private static boolean comprobarTresEnRaya(char[][] tablero, char turno,


int x, int y) {
boolean tresEnRaya = false;

tresEnRaya = comprobarFila(tablero, turno, x);


if (tresEnRaya==false)
tresEnRaya = comprobarColumna(tablero, turno, y);
if (!tresEnRaya)
if (x==y || (x==2 && y ==0)|| (x==0 && y ==2))
tresEnRaya = comprobarDiagonal(tablero, turno, x,y);

return tresEnRaya;
}

Etiquetas de documentación: deben disponerse en un orden determinado, ese orden es el siguiente:

Etiqueta. Descripción
@autor En clases e interfaces. Se pueden poner varios.
@version En clases e interfaces.
@param En métodos y constructores. Se colocarán tantos como parámetros tenga el constructor o método. Mejor
en el mismo orden en el que se encuentren declarados.
@return Informa de lo que devuelve el método, no se puede usar en constructores o métodos "void"
@throws Excepción lanzada por el método
@deprecated Indica que el método o clase es antigua y que no se recomienda su uso porque posiblemente
desaparecerá en versiones posteriores.

52-57
Tema 9. Arrays

Anexo: Ordenación de un array a tráves del método sort.

En el tema se ha estudiado como ordenar un array usando el método de la burbuja. La API de


JAVA facilita dicha tarea, el método estático sort de la clase Arrays ordena cualquier tipo de
array que le pasemos como argumento.

Arrays.sort(array)

Para utilizar la clase Arrays es necesario incluir el import:

import java.util.Arrays;

Ejemplo:

import java.util.Arrays;
public class Main {
public static void main(String[] args) {
//Array de tipo String
String[] nombres = {"juan", "pedro", "ana", "maria", "felipe", "luis", "eduardo"};

//Ordena el array
Arrays.sort(nombres);

//Mostramos el array ya ordenado


for (String i : nombres) {
System.out.print(i + ", ");
}
}// fin método main
}

Se le puede pasar cualquier array de cualquier tipo.

import java.util.Arrays;
public class Main {
public static void main(String[] args) {
//Array de String
int[] numeros = {4, 2, 6, -3, 10, 11, 166, 1};

//Ordena el array
Arrays.sort(numeros);

//Mostramos el array ya ordenado


for (int i : numeros) {
System.out.print(i + ", ");
}
}
}

53-57
Tema 9. Arrays

También tenemos la opción de ordenar solo una parte del array, indicando la posición del
elemento inicial y la del elemento final (que no se incluye en la ordenación).

Por ejemplo en el array anterior:

String [ ] nombres = {"juan", "pedro", "ana", "maria", "felipe", "luis", "eduardo"};


podemos ordenar solo los elementos 1, 2 y 3 ("pedro", "ana", "maria") del array nombres:

Arrays.sort(nombres, 1, 4);

El 1 indica la posición del elemento donde comienza la ordenación y el 4 indica la posición del
primer elemento que no entra en la ordenación.

El contenido del array después de esta ordenación es el siguiente:

juan
ana
maria
pedro
felipe
luis
eduardo

Solo se han ordenado los elementos 1, 2 y 3, el resto quedan igual.

Arrays.sort ordena de forma ascendente (de menor a mayor). Para ordenar un array de forma
descendente (de mayor a menor) hay que indicarlo utilizando el método reverseOrder() de la
clase Collections.

Para utilizar la clase Collections es necesario incluir el import:

import java.util.Collections;

Y para ordenar el array nombres de forma descendente debemos pasar al método sort además
de la referencia del array el argumento: Collections.reverseOrder(). Por ejemplo:

Arrays.sort(nombres, Collections.reverseOrder());

También podemos ordenar solo una parte del array en orden inverso. Por ejemplo, para ordenar
solo los elementos 1, 2 y 3 en orden inverso:

Arrays.sort(nombres, 1,4, Collections.reverseOrder());

El contenido del array es ahora:

juan
pedro
maria
ana
felipe
luis
eduardo

54-57
Tema 9. Arrays

Collections.reverOrder() solo funciona para arrays de objetos. Por este motivo si


queremos ordenar de forma descendente arrays de tipos primitivos debemos utilizar la clase
envolvente equivalente al tipo de dato básico.

Por ejemplo, para ordenar un array de enteros de forma descendente hay que declararlo de tipo
Integer en lugar de int.

Integer [] numeros = {3, 5, 1, 2, 1, 7, 0, -1};


Arrays.sort(numeros, Collections.reverseOrder());
for (int n : numeros) {
System.out.println(n);
}

Métodos de Array.sort

sort(byte[] a)
static void
Sorts the specified array into ascending numerical order.
sort(byte[] a, int fromIndex, int toIndex)
static void
Sorts the specified range of the array into ascending order.
sort(char[] a)
static void
Sorts the specified array into ascending numerical order.
sort(char[] a, int fromIndex, int toIndex)
static void
Sorts the specified range of the array into ascending order.
sort(double[] a)
static void
Sorts the specified array into ascending numerical order.
sort(double[] a, int fromIndex, int toIndex)
static void
Sorts the specified range of the array into ascending order.
sort(float[] a)
static void
Sorts the specified array into ascending numerical order.
sort(float[] a, int fromIndex, int toIndex)
static void
Sorts the specified range of the array into ascending order.
sort(int[] a)
static void
Sorts the specified array into ascending numerical order.
sort(int[] a, int fromIndex, int toIndex)
static void
Sorts the specified range of the array into ascending order.
sort(long[] a)
static void
Sorts the specified array into ascending numerical order.
sort(long[] a, int fromIndex, int toIndex)
static void
Sorts the specified range of the array into ascending order.
sort(Object[] a)
static void Sorts the specified array of objects into ascending order, according to the
natural ordering of its elements.

55-57
Tema 9. Arrays

sort(Object[] a, int fromIndex, int toIndex)


static void Sorts the specified range of the specified array of objects into ascending order,
according to the natural ordering of its elements.
sort(short[] a)
static void
Sorts the specified array into ascending numerical order.
sort(short[] a, int fromIndex, int toIndex)
static void
Sorts the specified range of the array into ascending order.
sort(T[] a, Comparator<? super T> c)
static
<T> void Sorts the specified array of objects according to the order induced by the
specified comparator.
sort(T[] a, int fromIndex, int toIndex, Comparator<?
static super T> c)
<T> void Sorts the specified range of the specified array of objects according to the order
induced by the specified comparator.

56-57
Tema 9. Arrays

Ejemplo 27Bis. Desarrollar una aplicación que ordene y muestre por pantalla una serie de
números introducidos como argumentos de programa. La aplicación tiene que mostrar la
entrada sin ordenar, ordenada ascendentemente y ordenada descendentemente.

Nota: Realiza la ordenación utilizando el método estático sort de la clase Arrays.

57-57

S-ar putea să vă placă și