Documentación Arrrays
Documentación Arrrays
ARRAYS
Un array (lista o tabla) es una secuencia de datos del mismo tipo. Los daios se ~aman elementos dci
array y se numeran consecutivamente O, 1,2,3... El tipo de elementos almacenados en el arra)' puede
ser cualquier tipo de dato simple de Java, o de tipo previamente declarado. ~orma1mente el arra)' se
utiliza para almacenar tipos tales como char, int o float.
Un array puede contener, por ejemplo, la edad de los alumnos de una clase, las temperaturas de
cada día de un mes en una ciudad determinada, o el número de personas que residen en cada una de las
diecisiete comunidades autónomas españolas. Cada item del array se denomina elemento.
Los elementos de.un array se numeran, como ya se ha comentado, consecutivamente O, 1,2,3...
Estos números se denominan valores índice o subíndice del array. El término «subíndice» se utiliza, ya
que se especifica igual que en matemáticas, como una secuencia tal como ao, al, a2... Estos números
localizan la posición del elemento dentro del array, proporcionando acceso directo al array.
Si el nombre del array es a, entonces a [O] es el nombre del elemento que está en la posición c.
a [1] es el nombre del elemento que está en la posición 1, etc. En general, el elemento i-ésimo está
en la posición i -1. De modo que si el array tiene n elementos, sus nombres son a [O], a [1], ...
a [n-1] . Gráficamente se representa así el array a con seis elementos.
O 1 2 3 4 ", 5
El array a tiene seis elementos: a [O] contiene 25.1, a [1] contiene 34.2, a [2] contiene 5.25, a [3~
contiene 7.45, a [4] contiene 6.09 y a [5] contiene 7.54. El diagrama de la Figura 11.1 representa real-
mente una región de la memoria de la computadora, ya que un array se almacena siempre con sus ele-
mentos en una secuencia de posiciones de memoria contigua. .
En Java, los índices de un array siempre tienen como límite inferior O,como índice superior el tama-
ño del array menos l.
Al igual que con cualquier tipo de variable, se deb~ declarar un array antes de utilizarlo. Un array se
declara de modo similar a otros tipos de datos, excepto que se debe indicar al compilador que es un
array y esto se hace con los corchetes.
int [Iv;
float w[] ;
El primer formato indica que todos los identificadores son arrays del tipo. El segundo formato es '11
array sólo el identificador al que le siguen los [].
, n '
Para indicar el número de elementos que tiene un array se usa el operador.new. Por ejemplo, para
crear una array que guarde las notas de la asignatura de música en un aula de 26 alumnos:
float []notas;
notas = new float[26];
j"
Se puede escribir en una misma sentencia:
float [] notas = new float[26];
o bien,
tipo nombreArray[];
nombreArray = new tipo[numeroDeElementos];
Por ejemplo, para crear un array (lista) de diez variables de tipo entero se escribe:
int al] = new int [10];
Esta declaración hace que el compilador reserve espacio suficiente para contener diez datos de tipo
entero. En Java, los enteros ocupan, normalmente, cuatro bytes, de modo que un array de diez enteros
ocupa 40 bytes de memoria. A esta memoria hay que añadir cuatro bytes más que Java utiliza para guar-
dar el número de elementos del array. La Figura 11.2 muestra el esquema de un array de diez elemen-
tos; cada elemento puede tener su propio valor.
Se puede acceder a cada elemento del array utilizando un índice en el nombre del array. Por ejem-
plo,
System.out.p~int(a[4]) ;
visualiza el valor del elemento 5 del array. Los arrays siempre comienzan en el elemento O.Así pues, el
array a contiene los siguientes elementos individuales:
a [O] a [1] a [2] a [3] a [4] a [5] a [6] a [7]
a [8] a [9]
L
Array de datos entero: a
1'0 I [O] I [1] I [2) I [3] 1 [4] I [5] I [6] I [7] I [8] I [9] I
.
si, por ejemplo, se.quiere crear un array de números reales. El tamaño es una constante representada
por una variable protegida (final).
final int N = 20¡
.,
.
.~
float vector[J ¡
vector = new float[NJ¡ 'i'
~
El índice de un array se denomina, con frecuencia, sub índice del array. El término procede de las mate-
máticas, en las que un subíndice se utiliza para representar un elemento determinado.
El método de numeración del elemento i-ésimo con el índice o subíndice i -1 se denomina indexa-
ción basada en cero. Su uso tiene el efecto de que el índice de un elemento del array es siempre el mis-
mo que el número de «pasos» desde el elemento inicial a [OJ a ese elemento. Por ejemplo, a [3 J está a
tres pasos o posiciones del elemento a [O J .
Ejemplos
int [Jedad = new int[SJ ¡ Array edad contiene cinco elementos: el primero, edad [OJ , y el
último, edad [4] .
int [J pesos, longitudes¡ Declara dos arrays de enteros (no asigna tamaño).
""~T- , T ,
En los programas se pueden referenciar elementos del array utilizando fórmulas para los subíndices.
Mientras que el subíndice pueda ser evaluado a un entero, se puede utilizar una constante, una variable
o una expresión para el subíndice. Así, algunas referencias individuales a elementos son:
". ,...
edad [4]
ventas [total+S] "
bonos [mes]
salario[mes[i]*S]
"
Los elementos de los arrays se almacenan en bloques contiguos. Así, por ejemplo, los arrays
int edades[];
char codigos[];
edades = new int[S];
codigos = new char[S]
[1] [1]
[2] [2]
[3] [3]
[4] [4]
Los arrays de caracteres funcionan de igual fonna que los arrays numéricos,partiendo de la base de
que cada carácter ocupa nonnalmente dos bytes. Así, por ejemplo, un array llamado nombre se puede
representar en la Figura 11.4.
nombre
e [O]
a [1]
z [2]
o [3]
r [4]
I [5]
a [6]
Java considera cada array un objeto, debido a ello "sepuede conocer el número de elementos de un array
accediendo al campo length. Este campo resulta muy útil cuando se pasa un array a un método.
double [J v = new double[15];
System.out.print(v.length) ;//escribe 15, número de elementos de v.
Java conoce el número de elementos de un array cuando se asigna el número de elementos con el
operador new o bien con una expresiónde inicialización. El campo length está protegido, no puede
1
EJEMPLO11.2. El método suma () tiene como argumento un array de tipo double. Se quiere que
devuelva la suma de sus elementos.
Para escribir este método, se define una variable que acumula los elementos del array. En un bucle con
tantas iteraciones como elementos (longitud) se determina la suma.
Java, al contrario que el lenguaje C, verifica el valor del índice de la variable que representa al array. Así,
por ejemplo, en Java si se define un array a de seis elementos, índices O a 5, entonces el acceso a [6]
es detectado por el compilador y genera un mensaje de error. Durante la ejecucióp. del programa tam-
bién puede ocurrir el acceso a un elemento fuera de los índices, esto producirá que el programa se «rom~
pa» en tiempo de ejecución, generando una excepción.
le
EJEMPLO 11.3. Protección frente a errores en el intervalo (rango) de valores de una variable de
índice que representa un array.
int n;
System.out.println("Entrada de datos, cuantos elementos: ? ");
System.out.flush(); ,
n = Integer.parselnt(entrada.readLine());
if (n > a.length)
return O;
for (int i = O; i < n; i++)
a[i]= Double.valueOf(entrada.readLine()) .doubleValue();
return 1;
Se deben asignar valores a los elementos del array antes de utilizados, tal como se asignan valores a
variables. Para asignar valores a cada elemento del array de enteros precios, se puede escribir:
precios [O] = 10;
precios [1] = 20;
precios [3] =30;
precios [4] = 40;
La primera sentencia fija precios [O] al valor 10, precios [1] al valor 20, etc. Sin embargo, este
método no es práctico cuando el array contiene muchos elementos. El método utilizado, normalmente,
es inicializar el array completo en una sola sentencia.
Cuando se inicializa un array, el tamaño del array se puede determinar automáticamente por las
constantes de inicialización. Estas constantes se separan por comas y se encierran entre llaves, como
en los siguientes ejemplos:
int numeros[] = {1O, 20, 30, 40, 50, 60}¡ /* Define un array de 6
elementos y se inicializan a las constantes */
int n[] = {3, 4, s} // Define un array de 3 elementos
char c[] = {'L' ,'u' ,'i' ,'s'}¡ // Define un array de 4 elementos
El array numeros tiene seis elementos, n tiene tres elementos y el array c tiene cuatro elementos.
Se pueden asignar valores numéricos representadbs mediante variables protegidas con la cláusula
final, de modo que las sentencias siguientes son válidas:
final int ENE = 31, FEB = 28, MAR = 31, ABR = 30, MAY = 31,
JUN = 30, JUL = 31, AGO = 31, SEP = 30, OCT = 31,
NOV = 30, DIC = 31¡
Pueden asignarse valores a un array utilizando un bucle for o while/do-while,y éste suele ser
el sistema más empleado normalmente. Por ejemplo, para inicializar todos los valores del array nume-
ros al valor -1, se puede utilizar la siguiente sentencia:
debido a que el valor del subíndice i varía de O al número de elementos -1, cada elemento del array
numeros se inicializa y se establece a-1.
EJEMPLO 11.4. El siguiente programa lee NUM enteros; a continuación visualiza el producto de
los núme.ros.
import java.io.*¡
class Inicial
public static void main(String [] a)throws IOException
{
nums[i] = Integer.parseInt(entrada.readLine());
}
~
Los arrays en Java se inicializana O por defecto. Por ello,la ejecución del siguiente programa visua-
liza O para los 10 valores del array:
Una cadena de texto es un conjunto de caracteres, tales como "ABCDEFG".Java soporta cadenas de tex-
to utilizando la clase String y StringBuffer implementada en el paquete Java.lang.
~""'~,.
Una vez que un objeto String es creado e inicializadocon una cadena, no puede modificarse.Los
métodos definidos en Stringpara concatenar, cambiar caracteres... no rBodifican la cadena, sino que
devuelven otro objeto String.Se puede decir que cadenas de tipo Stringson de sólo lectura.
Las cadenas definidas como objetos StringBuffer pueden cambiar la longitud de la cadena y el
contenido.
int h = 24; ~
System.out.print(~valor de h = ~ + h); /* concatena y forma la
cadena ~valor de h = 24" */
System.out.print(~valor de h = ~ +h+h); /* concatena y forma la
cadena ~valor de h = 2424" */
System.out.print(~valor de h = ~ +(h+h)); /* concatena y forma la
cadena ~valor de h =48" */
La clase Stringtiene definido el método concat () para unir o concatenar dos cadenas. El méto-
do devuelve otro objeto String con las dos cadenas unidas.
La longitud de una cadena se obtiene llamando al método length() de la clase String.Una con-
fusión habitual es obtener la longitud de un array con una llamada a length() ; o a la inversa, obtener
la longitud de una cadena con el campo length.
EJEMPLO 11.5. El programa crea un array r;lecadenas con las líneas de texto leídas desde el teclado.
El programa define un array de objetos cadena: String cads[];J:l máximo de líneas que van a ser leídas
es 23. Una vez terminada la entrada se muestran por pantalla.
import java.io.*;
class Cadenas
{
System.out.println("\n\tLíneas tecleadas");
for (int i = O; i < NUM; ++i)
~
System.out.println(i + ":" + cads[i]);
EJEMPLO 11.6. Visualizar el array entero aleat después de asignar datos en el mismo con el méto-
do random ()de laclase Math. El rango de números aleatorios que sea de 1 a 99.
El método random () genera números aleatorio s entre 0.0 y 1.0 (no inclusive) de tipo double. Para
generar números enteros entre 1 y 99 se multiplica por el límite superior y se suma 1:
1 + (int) Math,random()*99
import java.io.*;
class Aleatorio
'J
{
Los elementos de uwarray se pueden asignar a otro array con un bucle que recorra cada elemento, el
array destino tiene que estar definido con al menos los mismos elementos. Así, por ejemplo:
Esta copia se puede hacer con un método de la clase System, arrayCopy () .Antes conviene
recordar que los nombres de arrays son referencias a un bloque de memoria ,distribuida según el núme-
ro de elementos, por lo que si se hace una asignación entre dos variables array éstas se refieren al mis-
mo array. Por ejemplo:
double [] r, W;
r = new double[ll];
w = new double[15];
for (int j = o; j < r.length; j++)
r[j] = (double) 2*j-1;
j/ asignación de r a w
w = r;
Esta asignación hace que se pueda acceder a los elementos desde r o desde w, pero no se ha crea-
do un nuevo almacenamiento para los elementos; los 15 elementos que inicialmente se referencian
desde w se han perdido.
Para copiar los 11 elementos que tiene al vector r en wcon el método arrayCopy()hay que espe-
cificar la posición inicial del vector desde el que se copia, la posición del vector destino donde se inicia
la copia y el número de elementos:
System.arrayCopy(r,O,w,O,ll) ;
EJEMPLO 11.7
Se quiere definir dos arrays de tipo double, v y W,con 15 y 20 elementos, respectivamente. En el array
v se van a guardar los valoresde la función e 2x-1para valoresde x mayor o igual de 1.0;el array Wse ini-
cializa cada elemento al ordinal del elemento. A continuación se copian los 10 últimos elementos de v
a partir del elemento 11 de w. Por último se escriben los elementos de ambos arrays.
El programa que se escribe a continuación sigue los pasos indicados en el enunciado. Se usa la fun-
ción exp () de la clase Math para el cálculo de la función e 2x-l, asícomoelmétodoarrayCopy() para
realizar la copia de elementos de array pedida.
import java.io.*;
class CopiArray
{
En este ejemplo se copian elementos de un array w en un array p, se comete un error por no tener
suficiente memoria reservada:
Los arrays vistos anteriormente se conocen como arrays unidimensionales (una sola dimensión) y se
caracterizan por tener un solo subíndice. Estos arrays se conocen también por el término listas. Los
arrays multidimensionalesson aquellosque tienen más de una dimensióny, en consecuencia,más de un
índice. Los arrays más usuales son los de dos dimensiones, conocidos también por el nombre de tablas
o matrices. Sin embargo, es posible creararrays de tantas dimensiones como requieran sus aplicaciones,
esto es, tres, cuatro o más dimensiones.
Un array de dos dimensiones equivale a una tabla con múltiples filas y múltiples columnas (Fig. 11.5).
o 2 3 n
"
m
..-....-.-....-.........-...-..
Obsérvese que en el array bidimensional de la Figura 11.5, si las filas se etiquetan de O a m y las
columnas de O a n, el número de elementos que tendrá el array será el resultado del producto (m+ 1) *
(n+ 1). El sistema de localizar un elemento será por las coordenadas representadas por su número de fila
y su número de columna (a, bY.La sintaxis para"=
la declaración de un array de dos dimensiones es:
<tipo de datoElemento> <nombre array> [] [];
o bien
<tipo de datoElemento> [] []<nombre array>;
Estas declaraciones no reservan memoria para los elementos de la matriz o tabla,rrealmente son
referencias. Para reservar memoria y especificar el número de filas y de colum~as se utiliza el operador
new. Así, a partir de las declaraciones anteri0res:
El operador new se puede aplicar a la vez que se hace la -declaración.La sintaxis para definir una
matriz:
Los elementos de los aITays se almacenan en memoria de modo que el subíndice más próximo al
nombre del aITay es la fila y el otro subíndice, la columna. En la Tabla 11.1 se representan todos los
elementos y sus posiciones relativas en memoria del alTay,int tabla[] [] =new int [4] [2] , supO-
niendo que cada entero ocupa cuatro bytes.
2. int tabla2 [] [] = {
{1, 2, 3, 4},
{s, 6, 7, s},
{9, la, 11, 12}
}¡
tabla1 [] []
o 2 Columnas
Filas o 51 52 53
54 55 56
tabla2 [ ] [ ]
o 2 3 " Columnas
Filas o 1 2 3 4
5 6 7 8
2 9 10 11 12
Java trata los arrays de dos o más dimensiones como array de arrays, por ello se pueden crear arrays
de dos dimensiones no cuadradas. En los siguientes ejemplos se crean arrays de distintos elementos
cada fila.
1. double tb[] [] = { {loS, -2.S}, {S. O, -0.0, loS} };
Se ha definido una matriz de dos filas, la primera con dos columnas y la segunda con tres.
2. int[]a = {1,3,S}, b = {2,4,6,8,10};
int mtb [] [] = {a, b};
Se ha definido el array a de tres elementos, el b de cuatro elementos y la matriz mtb de dos filas, la
primera con tres elementos o columnas, y la segunda con cuatro.
Se puede realizar la definición de una matriz en varias sentencias, primero especificando el núme-
ro de filas y a continuación el número de elementos de cada fila. En los siguientes ejemplos se crean
matrices de esta forma.
int va = {4,3,2,1}¡
int Vl = {7,6,5}¡
int V2 = {9,8}¡
int V3 = {a}¡
ventas
¡ length
ventas[O][O]
length
ventas[O]
ventas[1]
0][2]
ventas[2]
1][0] H
1][1] O
ventas[2][0] B
Figura 11.7. Disposición en memoria de ventas [] [1.
')l
. 11.5.2. Acceso a los elementos de los arrays bidimensionales
Se puede acceder a los elementos de arrays bidimensionales de igual forma que a los elementos de un
array unidimensional.La diferencia reside en que en los elementosbidimensionales deben especificar-
se los índices de la fila y la columna.
El formato general para asignación directa de valores a los elementos es:
inserción de elementos
.,
<nombre array> [indice fila] [indice columna]=valor elemento;
extracción de elementos .~
Se puede acceder a los elementos de arrays bidimensionales mediante bucles anidados. Su sintaxis es:
El número de filas y de columnas se puede obtener con el atributo length. Con este atributo, la
sintaxis para acceder a los elementos:
<tipo> Matriz [] [] ;
<especificación de filas y columnas con operador new>
for (fila = O; fila < Matriz.length; ++fila)
for (col = O; col < Matriz [fila] .length; ++col)
Procesar elemento Matriz [fila] [col] ;
EJEMPLO 11.8. Define una tabla de discos, el número de filas y de columnas son datos de entrada.
float discos [] [] ;
int fila, col, NumFilas, NumCols;
System.out.print("Número de filas: ");
System.out.flush() ;
NumFilas = Integer.parselnt(entrada.readLine());
System.out.print("Número de columnas: ");
System.out.flush() ;
NumCols = Integer.parselnt(entrada.readLine());'
discos = new float [NumFilas] [NumCols] ;
// Entrada de datos
for (fila = O; fila < NumFilas; fila++) {
El método leer () lee un array (una tabla) de dos dimensiones y el método visualizar.() presenta
la tablaen lapantalla. 0
import java.io.*;
class Tabla
{
int i,j;
BufferedReader entrada = new BufferedReader(
new InputStreamReader(System.in)) i
System.out.println("Entrada de datos de la matriz");
for (i = O; i < a.length; i++)
{
System.out.println("Fila: " + i);
System.out.flush();
for (j = o; j < a[i] .length¡ j++)
a[i] [j]= Integer.parseIne(entrada.readLine());
int i,j;
System.out.println("\n\t Matriz leida\n");
for (i = O; i < a.length; i++)
{
Ejecución
Fila o:
45
75
25
10
40
Fila 1:
Matriz leida
45 75 25 10 40
20 14 36 15 26
21 15 37 16 27
Java proporciona la posibilidad de almacenar varias dimensiones, aunque raramente los datos del mun-
do real requieren más de dos o tres dimensiones. El medio más fácilde dibujar un array de tres dimen-
siones es imaginar un cubo tal como se muestra en la Figura 11.8.
Un array tridimensional se puede considerar como un conjunto de arrays bidimensionales combi-
nados juntos para formar, en profundidad, una tercera dimensión. El cubo se construye con filas(dimen-
sión vertical),columnas (dimensión horizontal) y planos (dimensión en profundidad). Por consiguien-
te, un dado se localiza
elemento especificando su plano, fila y columna. Una definiciónde un array
tridimensionalequipos es: .