Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Arreglos Unidimensionales
En un arreglo unidimensional, la posicin de un elemento en el arreglo est dada por un valor entero llamado ndice que representa la distancia de ese elemento con respecto al primer elemento del arreglo. Por ejemplo si deseamos almacenar las calificaciones de un grupo de alumnos podemos tener un arreglo llamado califs formado de 50 variables: califs[0] representa la calificacin del primer alumno, califs[1] representa la calificacin del segundo alumno, etc. El nmero entre corchetes es el ndice. Note que el primer elemento tiene un ndice igual a 0 y el ltimo un ndice igual a n-1, donde n es el nmero de elementos del arreglo.
ITSON
116
tipo[] nomArreglo;
tipo es el tipo base del arreglo, el tipo de cada una de las variables que forman el arreglo, y puede ser cualquier tipo de datos: primitivos o clases. nomArreglo es un identificador, el nombre de la referencia al arreglo. Por ejemplo:
int califs[]; double[] precios; Cancion canciones[];
tamArreglo es una expresin de tipo entero que indica el tamao del arreglo, el nmero de variables de la lista. Los corchetes encerrando a tamArreglo no indican que ste sea opcional. Aqu forman parte de la sintaxis de la creacin de un arreglo. Por ejemplo:
califs = new int[50]; precios = new double[100]; canciones = new Cancion[20];
La declaracin de la referencia a un arreglo y el reservado de memoria para el mismo pueden combinarse en una sentencia cuya sintaxis es:
tipo nomArreglo[] = new tipo[tamArreglo];
ITSON
Tema 5
117
Por ejemplo:
int califs[] = new int[50]; double[] precios = new double[100]; Cancion canciones[] = new Cancion[20];
Donde cte1 [, cte2] ... es una lista de constantes encerrada entre llaves, { y }, que son los valores a los que se inicializan los elementos del arreglo. El tamao del arreglo es el nmero de constantes. Por ejemplo, en la declaracin
int x[] = {0, 1, 2, 3, 4};
ITSON
118
accede al j-simo + 3 elemento del arreglo mats. Por ejemplo supongamos que deseamos acceder en forma secuencial a los elementos del arreglo califs para sacar el promedio de las calificaciones. El cdigo para hacer esto sera
suma = 0; for(i = 0; i < nAlumnos; i++) suma += califs[i]; promedio = (double)suma/nAlumnos;
donde nAlumnos es el nmero de calificaciones que estn almacenadas en el arreglo. Este valor puede ser menor o igual al tamao del arreglo califs. Cada vez que se le asigna un valor u objeto a un elemento de un arreglo, el sistema de ejecucin de Java verifica que el tipo del arreglo sea compatible con el tipo del valor u objeto asignrsele. Si no son compatibles ocurre una excepcin del tipo: java.lang.ArrayStoreException. Cada vez que se accede a un elemento de un arreglo, el sistema de ejecucin de Java verifica que el valor del ndice es un valor vlido, esto es, que es nmero comprendido entre 0 y tamArreglo 1. De no ser as ocurre una excepcin del tipo: java.lang.ArrayIndexOutOfBoundsException.
En Java podemos pasarle como parmetro a un mtodo, una referencia a un arreglo. No se le est pasando una copia del arreglo, slo la referencia. La sintaxis de un parmetro que representa la referencia a un arreglo unidimensional es la siguiente:
tipo nomParArreglo[]
donde tipo es el tipo base del arreglo y nomParArreglo es el nombre del parmetro que representa la referencia al arreglo. Note que los corchetes estn vacos. Al llamar al mtodo, el argumento ser la referencia al arreglo, el cual es el nombre del arreglo:
nomArreglo
Tambin es posible que un mtodo nos regrese una referencia a un arreglo. La sintaxis para declarar que el mtodo regresa una referencia a un arreglo unidimensional es:
ITSON
Tema 5
119
donde tipo es el tipo base del arreglo y nomMetodo es el nombre del mtodo que nos regresa la referencia a un arreglo.
El ciclo for-each
La versin 5 de java extendi la sintaxis del ciclo for para facilitar la iteracin sobre los elementos de un arreglo o de una coleccin. Las colecciones se vern en el Tema 6. A esta nueva variante del ciclo for se le conoce como ciclo for-each. Si deseamos iterar sobre los elementos de un arreglo usando ciclo for normal, la sintaxis sera:
for(int i = 0; i < nomArreglo.length; i++) { tipo nomVariable = nomArreglo[i]; cuerpo del ciclo }
Haciendo ms claro el cdigo. Por ejemplo el siguiente cdigo que utiliza el for normal:
suma = 0; for(i = 0; i < califs.lenght; i++) suma += califs[i]; promedio = (double)suma/ califs.lenght;
Slo podemos acceder a los elementos del arreglo. No podemos asignarle un valor a los elementos de un arreglo.
ITSON
120
Slo se puede trabajar con un solo arreglo. No podemos, por ejemplo comparar dos arreglos. Slo se puede accede un elemento a la vez. No podemos comparar, por ejemplo elementos consecutivos. Slo se puede recorrer la coleccin hacia adelante y en incrementos de uno. No puede iterarse sobre slo parte de la coleccin. El ciclo for-each recorre toda la coleccin. No se use si se desea compatibilidad con cdigo previo a la versin 5 de java.
En la clase Medios el atributo medios es una referencia al arreglo canciones o peliculas creados en las clases Canciones o Peliculas. Los mtodos de la clase Medios trabajan tanto con canciones como con pelculas. int cuentaGenero(String nombre) nos regresa el nmero de canciones o pelculas del gnero cuyo nombre est dado por el parmetro ya sea en el arreglo canciones o pelculas. Medio masViejo() nos regresa la cancin o pelcula ms vieja ya sea en el arreglo canciones o pelculas. Medios.java
/* * Medios.java * * Creada el 15 de septiembre de 2007, 12:21 PM */
ITSON
Tema 5
121
package catalogos; import objetosNegocio.Medio; /** * Esta clase permite realizar algunas operaciones con objetos de tipo medio: * Canciones o peliculas, almacenadas en un arreglo. * * @author mdomitsu */ public class Medios { protected Medio medios[]; /** * Cuenta los medios del mismo genero que el parmetro * @param nombre Nombre del gnero de los medios a contar * @return Numero de medios del mismo genero que el parmetro */ public int cuentaGenero(String nombre) { int cuenta = 0; // Recorre el arreglo for (Medio medio : medios) { // Si es el gnero especificado if (nombre.equals(medio.getGenero().getNombre())) { // Incrementa el contador de generos cuenta++; } } return cuenta; } /** * Regresa el medio de mayor antiguedad * @return El medio de mayor antiguedad */ public Medio masViejo() { // Suponemos que el medio de mayor antiguedad es el primero Medio medioMasViejo = medios[0]; // Recorre el arreglo for (Medio medio : medios) { // Si hay otro de mayor antiguedad, substituyelo if (medio.getFecha().before(medioMasViejo.getFecha())) { medioMasViejo = medio; } } return medioMasViejo; } }
ITSON
122
Canciones(Cancion canciones[]) Inicializa el arreglo canciones de la clase al arreglo de su parmetro. String[] obtenInterpretes() nos regresa en un arreglo los diferentes interpretes de las canciones del catlogo. boolean contieneInterprete(String interpretes[], String interprete, int numInterpretes) regresa verdadero si el arreglo interpretes con numInterpretes contiene al intrprete interprete. Canciones.java
/* * Canciones.java * * Creada el 15 de septiembre de 2007, 12:21 PM */ package catalogos;
import objetosNegocio.Cancion; /** * Esta clase permite realizar algunas operaciones con objetos de tipo * Cancion almacenadas en un arreglo. * * @author mdomitsu */ public class Canciones extends Medios { // Arreglo para almacenar las canciones private Cancion canciones[]; /** * Inicializa el atributo de la clase y hace que la referencia medios * apunte al arreglo canciones * @param canciones El arreglo de canciones */ public Canciones(Cancion canciones[]) { this.canciones = canciones; medios = canciones; } /** * Regresa un arreglo con los interpretes de las canciones del catalogo * @return */ public String[] obtenInterpretes() { String interpretesTemp[] = new String[canciones.length]; String interpretes[] = new String[canciones.length]; int numInterpretes = 0; // Recorre el arreglo for(Cancion cancion: canciones) { // Si el interprete de la cancion no esta en el arreglo de // interpretes if(!contieneInterprete(interpretesTemp, cancion.getInterprete(), numInterpretes)) {
ITSON
Tema 5
123
// Agrega al interprete al arreglo de interpretes interpretesTemp[numInterpretes] = cancion.getInterprete(); numInterpretes++; } // Ajusta el tamao del arreglo de interpretes al nmero de // interpretes interpretes = new String[numInterpretes]; System.arraycopy(interpretesTemp, 0, interpretes, 0, numInterpretes); } return interpretes; } /** * Determina si el interprete del parametro se encuentra en el arreglo * del parametro * @param interpretes Arreglo de interpretes * @param interprete Interprete a buscar en el arreglo * @param numInterpretes numero de interpretes en el arreglo * @return true si el interprete del parametro se encuentra en el arreglo * del parametro, false en caso contrario, */ private boolean contieneInterprete(String interpretes[], String interprete, int numInterpretes) { // Recorre el arreglo for(int i = 0; i < numInterpretes; i++) { // Si el interprete esta en el arreglo, regresa verdadero if(interprete.equals(interpretes[i])) return true; } return false; } }
Los mtodos de la clase Peliculas solo operan sobre pelculas. Peliculas (Pelicula peliculas []) Inicializa el arreglo peliculas de la clase al arreglo de su parmetro. int numPeliculasActor(String actor) Regresa el nmero de pelculas en la que aparece el actor del parmetro: Peliculas.java
/* * Peliculas.java * * Creada el 15 de septiembre de 2007, 12:21 PM */ package catalogos;
import objetosNegocio.Pelicula;
ITSON
124
/** * Esta clase permite realizar algunas operaciones con objetos de tipo * Pelicula, almacenadas en un arreglo. * * @author mdomitsu */ public class Peliculas extends Medios { // Arreglo para almacenar las pelculas private Pelicula peliculas[]; /** * Inicializa el atributo de la clase y hace que la referencia medios * apunte al arreglo peliculas * @param peliculas El arreglo de peliculas */ public Peliculas(Pelicula peliculas[]) { this.peliculas = peliculas; medios = peliculas; } /** * Regresa el numero de peliculas en las que actua el actor del parametro * @param actor que actua en las peliculas * @return Numero de peliculas en las que actua el actor del parametro */ public int numPeliculasActor(String actor) { int nPeliculasActor = 0; // Recorre el arreglo for(Pelicula pelicula: peliculas) { // Si es el actor especificado if(pelicula.getActor1().equals(actor) || pelicula.getActor2().equals(actor)) // incrementa el contador nPeliculasActor++; } return nPeliculasActor; } }
Arreglos Multidimensionales
En un arreglo bidimensional, la posicin de un elemento en el arreglo est dada dos valores que representan el rengln y la columna del elemento en la tabla. En un arreglo tridimensional, la posicin de un elemento en el arreglo est dada por tres valores que representan la tabla, el rengln y la columna del elemento en el arreglo, etc.
ITSON
Tema 5
125
tipo es el tipo base del arreglo y puede ser es cualquier tipo primitivo o clase. . nomArreglo es un identificador, el nombre de la referencia al arreglo. Por ejemplo:
int calPars[][]; double[][][] ventas;
numTablas, numFilas, numCols son expresiones enteras que representan los nmeros de tablas, filas y columnas de los arreglos. Por ejemplo:
calPars = new int[4][50]; ventas = new double[3][4][12];
La declaracin de referencias a arreglos multidimensionales y el reservado de memoria para ellos mismos pueden combinarse. Por ejemplo la sintaxis para declarar y crear arreglos bidimensionales y tridimensionales es:
tipo nomArreglo[][] = new tipo[numFilas][numCols]; tipo nomArreglo[][][] = new tipo[numTablas][numFilas][numCols];
ITSON
126
Por ejemplo:
int calPars[][] = new int[4][50];
le asigna al elemento que se encuentra en la quinta fila, tercera columna del arreglo calPars el valor de 9.
ventas[2][3][1] = 1252.30
le asigna al elemento que se encuentra en el tercer plano, cuarta fila, segunda columna del arreglo ventas el valor de 1252.30. Por ejemplo el siguiente cdigo nos permite calcular el promedio de las calificaciones de cada alumno y la calificacin promedio del grupo:
ITSON
Tema 5
127
int i, j, suma; double sumaT, promedioT; int calPars[][] = new int[50][4]; double promedios[] = new double[50]; ... sumaT = 0; for(i = 0; i < nAlums; i++) { suma = 0; for(j = 0; j < 4; j++) suma += calPars[i][j]; promedios[i] = (double)suma/4; sumaT += promedios[i]; } promedioT = sumaT/nAlums;
En realidad los arreglos multidimensionales son arreglos de arreglos. Un arreglo bidimensional es un arreglo donde cada elemento del arreglo es a su vez un arreglo unidimensional. Un arreglo tridimensional es un arreglo donde cada elemento del arreglo es a su vez un arreglo bidimensional, etc. Cada uno de los arreglos individuales de un arreglo multidimensional puede ser referenciado independientemente. Por ejemplo, para las declaraciones:
int calPars[][] = new int[4][50]; double[][][] ventas = new double[3][4][12]; calPars[i] es una referencia al i-simo arreglo unidimensional del arreglo bidimensional calPars, esto es, el i-simo rengln de la tabla calPars; ventas[i] es una referencia al isimo arreglo bidimensional del arreglo tridimensional ventas, esto es, la i-sima tabla del arreglo tridimensional ventas; y ventas[i][j] es una referencia al i-simo, j-simo arreglo unidimensional del arreglo tridimensional ventas, esto es, al j-simo rengln de la i-sima tabla del arreglo tridimensional ventas.
donde tipo es el tipo base del arreglo y nomParArreglo es el nombre del parmetro que representa la referencia al arreglo. Note que los corchetes estn vacos. Al llamar al mtodo, el argumento ser la referencia al arreglo, el cual es el nombre del arreglo:
ITSON
128
nomArreglo
Tambin es posible que un mtodo nos regrese una referencia a un arreglo multidimensional. La sintaxis para declarar mtodos que regresan referencias a arreglos en dos y tres dimensiones es, respectivamente:
tipo[][] nomMetodo() { ... } tipo[][][] nomMetodo() { ... }
donde tipo es el tipo base del arreglo y nomMetodo es el nombre del mtodo que nos regresa la referencia a un arreglo.
Cadenas
Junto con el procesamiento numrico, una de las tareas que ms frecuentemente realiza la computadora es el procesamiento de textos. Algunas de las aplicaciones en las que se utiliza el procesamiento de texto son: Bases de datos como directorios telefnicos, nminas de una empresa, expedientes de alumnos de una escuela, etc. Procesadores de palabras y programas para publicacin Compiladores e intrpretes.
Todos los programas anteriores requieren de la capacidad de almacenar y manipular texto, es decir, secuencias de caracteres. A estas secuencias de caracteres se les conoce como cadenas. En una computadora slo se pueden almacenar nmeros y por lo tanto cada uno de los caracteres de una cadena es codificado mediante un nmero. El esquema de codificacin ms empleado en las computadoras es el esquema de codificacin ASCII (por las siglas en ingls del comit que lo creo: American Standard Code for Information Interchange), el cual codifica cada carcter mediante un nmero en el rango 0 127, por lo que este esquema slo permite codificar 128 caracteres, lo que es insuficiente para representar todos los caracteres empleados en los diferentes lenguajes empleados en los diferentes pases. Debido a esto, Java utiliza para codificar los caracteres un nuevo esquema de codificacin llamado Unicode. Unicode provee un cdigo nico para cada carcter, sin importar la plataforma, programa o lenguaje. Para lograr esto Unicode utiliza dos bytes para codificar cada carcter, lo que le permite representar 65,536 caracteres diferentes. Por compatibilidad con el cdigo ASCII, los primeros 128 cdigos de Unicode se utilizan para representar los mismos caracteres que los representados por el cdigo ASCII.
ITSON
Tema 5
129
Para el manejo de cadenas, la API de Java nos proporciona varias clases entre ellas las clases String y StringBuffer.
Clase String
La clase String representa una cadena de caracteres. Las instancias de la clase String son constantes. Su valor no puede cambiarse despus de ser creadas. Todas las literales de tipo cadena en Java se implementan como instancias de la clase String. Por ejemplo, la siguiente literal:
"Hola"
crea una instancia de tipo String con la secuencia de caracteres: H, o, l, a. Al igual que con cualquier otro objeto, podemos declarar una referencia a String y al mismo tiempo crear un objeto y asocirselo. Por ejemplo:
String mensaje = "Hola";
El lenguaje Java define el operador (+) para concatenacin cadenas y el operador (+=) que combina la concatenacin con la asignacin. Por ejemplo, siguiendo la declaracin anterior, podemos tener la siguiente sentencia:
mensaje = mensaje + " Juan";
la cual es equivalente a:
mensaje += " Juan";
Las sentencias anteriores podran interpretarse como que la cadena mensaje ha cambiado su contenido al agregrsele la cadena " Juan". Sin embargo, lo que ha pasado es que al concatenarse las cadenas mensaje y " Juan", se crea un nuevo objeto de tipo String con la cadena resultante y este nuevo objeto se asigna a la referencia mensaje. El lenguaje Java tambin define la conversin de objetos a cadenas mediante el mtodo toString() definido para la clase Object de la cual heredan todas las clases de Java. La Clase String posee un conjunto muy rico de mtodos. La tabla 5.1 muestra algunos de esos mtodos:
ITSON
130
ITSON
Tema 5
131
ITSON
132
ITSON
Tema 5
133
Clase StringBuffer
Los objetos de tipo StringBuffer son cadenas como las del tipo String pero su contenido puede modificarse invocando una serie de mtodos. Tabla 5.2 Algunos Mtodos de la Clase StringBuffer
public StringBuffer() Construye una instancia de StringBuffer vaco y con una capacidad inicial de 16 caracteres. public StringBuffer(int length) Construye una instancia de StringBuffer vaco y con una capacidad inicial dada por el parmetro length. Lanza: NegativeArraySizeException Si el parmetro es negativo. public StringBuffer(String str) Construye una instancia de StringBuffer con la secuencia de caracteres contenida en el parmetro str. Lanza: public public public public public public public public public public NullPointerException Si str es nulo. StringBuffer append(boolean b) StringBuffer append(char c) StringBuffer append(char [] str) StringBuffer append(double) StringBuffer append(float f) StringBuffer append(int i) StringBuffer append(long l) StringBuffer append(Object o) StringBuffer append(String str) StringBuffer append(StringBuffer sb)
Le agrega a esta cadena, una cadena con la representacin del parmetro. Regresa una referencia a esta cadena public char charAt(int index) Regresa el carcter cuyo ndice est dado por el parmetro index. El primer carcter tiene ndice 0. Lanza: IndexOutOfBoundsException Si el ndice es negativo o mayor que la longitud de esta cadena.
ITSON
134
Inserta en esta cadena una subcadena con la representacin del segundo parmetro en la posicin dada por el parmetro offset. Regresa una referencia a esta cadena. Lanza: StringIndexOutOfBoundsException Si start es invlido. public int lastIndexOf(String str) Regresa el ndice de la ltima ocurrencia dentro de esta cadena de la subcadena dada por el parmetro str. Si str no est en esta cadena regresa -1. La bsqueda se hace de atrs hacia adelante. Lanza: NullPointerException Si la cadena dada por el parmetro es null.
ITSON
Tema 5
135
ITSON