Está en la página 1de 44

TIPOS DE DATOS Definidos

por el programador
Estructuras estáticas

 arrays

 arrays multidimensionales

cadenas de caracteres: Strings


ARRAYS
1.- Arrays ó vectores
 Hasta ahora hemos utilizado una serie de variables en nuestros programas que
almacenan números, nombres, acumuladores, etc.
 Supongamos que queremos guardar los habitantes de todas las provincias
españolas: necesitaríamos 52 variables todas similares.
 Para evitar esto se utilizan los arrays o vectores, que van a estar formados
por una serie de posiciones consecutivas de memoria, todas del mismo tipo, a
las que se les dota de un nombre común y se les identifica por su posición o
índice:

habitantes …

Posicion: 0 Posicion.1 Posicion: 52


 Sirven para almacenar varios datos relacionados del mismo tipo (varios
números enteros, varios objetos de la clase Empleado, etc.)
 En la mayoría de los lenguajes de programación los términos arrays y
vectores son sinónimos; sin embargo, en Java existen realmente dos
posibilidades: Arrays y Vectores
◦ Los arrays son estructuras estáticas, es decir, no pueden cambiar de tamaño una
vez creados (tamaño fijo).

◦ Los vectores son estructuras dinámicas, es decir pueden cambiar de tamaño en


tiempo de ejecución, cuando se inserta un nuevo elemento (invocando métodos
que extienden su tamaño). Pertenecen a la clase Vector del API de Java que
tiene métodos predefinidos para su manipulación.

 Vamos a ver en este tema sólo los arrays.


1.1.- Declaración de Arrays
 Sintaxis:
TipoDatos nombreArray [ ];
o también
TipoDatos [ ] nombreArray;

 El TipoDatos indica el tipo de cada uno de los componentes del array.


 Puede ser un tipo simple (int, double, etc.) o complejo (objetos de una clase).
 Ejemplo:
int habitantes [ ];
int [ ] habitantes;
Profesor [ ] arrayProfesor; //array de objetos de clase Profesor
1.2.- Creación de arrays
 Java considera a los arrays como objetos, y por tanto deben instanciarse con
new .
 El tamaño del array se define cuando se instancia:
TipoDatos nombrearray[ ];
TipoDatos nombrearray[ ] = new TipoDatos[tamaño];

 Ejemplos:
int array1 [ ]; // define "array1" como un objeto array de enteros
array1=new int[5]; // crea (instancia) el array, con capacidad de 5 enteros
int [ ] x, y; // define 2 arrays de enteros
x= new int[5]; // crea el array x de tamaño 5
y= new int[3]; // crea el array y de tamaño 3
habitantes = new int [52]; // define el tamaño del array de la diapositiva anterior

 También pueden unirse las etapas de declaración y creación en una sola:


int [ ] habitantes = new int[52];
int habitantes[ ] = new int[52];
1.3.- Inicialización
 Hemos dicho que se pueden crear arrays de cualquier tipo y si no le ponemos
valores se inicializan al valor por defecto del tipo correspondiente (0 para
valores numéricos, nulo para char, false para boolean y null para Strings y
objetos de otras clases).
 Ejemplos:
Profesor [ ] arrayProfesor; //crea un array de objetos de la clase Profesor y lo
// va a inicializar a null
int [ ]habitantes = new int[52]; // el array tiene 52 elementos tipo int inicializados a 0
 Los arrays se pueden inicializar con valores pasados entre llaves y separados
por comas y en este caso no se precisa operador new:
◦int b[ ] = {10,20,30,40,50,60,70,80,90,100}.
◦String dias[ ] = {“lunes”,“martes”,“miercoles”,“jueves”,“viernes”,
“sabado”,“domingo”}
 También se pueden inicializar uno a uno una vez declarados accediendo a
través de su índice int a[0] = 12; int a[1] = -2; …
 Se pueden inicializar usando un bucle for para ir metiendo un determinado
valor en cada elemento por ejemplo:
for(int i=0; i<numeros.length; i++) {numeros[i]=i*i+4;}
1.4.- Utilización de Arrays
 El acceso a los elementos del array se realiza haciendo uso de los
corchetes y colocando entre ellos la posición o índice a la que se accede:
nombre_array[0] nombre_array [1] nombre_array [2]
◦ Ejemplo: habitantes[0] daría el nº de habitantes de la 1ª provincia.
 El primer elemento de un array es el que está en la posición 0.
 El índice puede ser un valor, una variable o también una expresión de tipo
byte, short, o int.
 Java comprueba durante la ejecución que el acceso a los elementos de un
array no excede de sus límites (esto provocaría una excepción
ArrayIndexOutOfBoundsException).
 Hay que tener en cuenta que, como el índice del array empieza en 0, las
posiciones estarán comprendidas entre 0 y tamaño-1. El acceso a una
posición > ó = al tamaño provoca la excepción anterior.
 Para conocer el tamaño del array se puede usar la variable miembro
implícita length (longitud). En ese caso, las posiciones están comprendidas
entre 0 y length-1.
◦ Ejemplo: habitantes.length valdría 52
 Los arrays se suelen manipular con bucles de tipo for:
 Existe un tipo de bucle especial llamado for each que también pueden usarlo los arrays y hacen que su manipulación sea más sencilla:
for ( tipo_variable: array_de_variables_tipo)

Nota: este bucle lo que hace es llevar a la variable elemento de tipo String el contenido de cada una de las posiciones del array array
1.5.- Arrays de objetos
 Hemos dicho que tambien se pueden crear arrays de objetos.
 Hay que tener en cuenta que, cuando se declara un array de objetos, no se están creando los
mismos, por lo que además de crear el array hay que crear los objetos.

Voy creando el array

Creo objeto

1.6.- Contenido real de un Array
Puede tener datos de tipos simples
◦ Al reservar memoria para un array de n elementos de tamaño (x) vamos a reservar x*n
◦ Los datos se guardan en el propio array
int array[ ] = new int[3] // array de 3 elementos

array

array[0] array[1] array[2]


 Tambien puede tener datos de tipo objetos
◦ En Java todas las variables que representan objetos son realmente referencias que nos permiten localizar el objeto en memoria
◦ Cuando reservamos memoria para un array de n objetos realmente reservamos memoria para n referencias
Coche arrayCoches[ ] = new Coches[3] // array de 3 elementos

arrayCoches

null null null


Al hacer arrayCoches[1] = new Coche (parametros) el null se cambiara por Coche

16 -5 0
1.7.- Métodos de los arrays
 Como Java trata los arrays como si fueran objetos, existen una serie de métodos
heredados de la clase Object (que está en el paquete java.lang):
◦ equals: devuelve true o false si dos referencias son el mismo objeto
◦ clone: duplica un objeto
 En el ejemplo siguiente, los arrays temperatura1 y temperatura2 son distintos
porque son objetos diferentes aunque coincidan en contenido.
 Sin embargo, temperatura1 y temperatura3 son iguales porque los dos apuntan
al mismo objeto (que en realidad es una dirección de memoria donde empieza el
array)
1.11.- Uso de Arrays en métodos
 Un array puede:
◦ Ser pasado como parámetro a un método
public static void main (String arg[])
 Los argumentos del método main se toman como un array de Strings.
 El paso del array como parámetro es por referencia, por lo que si se
modifica en el método, las modificaciones permanecen en el array.
Esto es así, porque un array es un objeto y por tanto una referencia a
donde se encuentran los valores.
◦ Ser devuelto como resultado de la ejecución de un método
public arrayEjemplo[ ] metodo();
Método que modifica el array
recibido como parámetro. Este
cambia después de su ejecución
1.12.- Algoritmos de ordenación
 Un array es mucho más eficiente si está ordenado, es decir, si las
componentes guardan un orden (creciente o decreciente) entre sí.
 La ordenación de los arrays facilita las búsquedas de elementos en ellos.
 Hay varios algoritmos de ordenación, algunos de los cuales son:
◦ Ordenación por selección directa
◦ Ordenación por el método de la burbuja
◦ Ordenación por el método de la burbuja con test de comprobación
Ordenación por selección directa
 Este algoritmo consiste en comparar una componente del array con todas las
siguientes de forma que, si es mayor, se intercambian.
 De esta forma, se coloca en la 1ª componente el elemento menor y el proceso
se repite para la 2ª, etc.
Compara la componente 0 y 1,
3 2 5 6 1 como 3 es mayor que 2 las
intercambia

Compara la componente 0 y 2,
2 3 5 6 1 como 2 es menor que 5 no las
intercambia

2 3 5 6 1 Compara la 0 y la 3 No hay
intercambio

Compara la 0 y la 4 Sí hay
2 3 5 6 1 intercambio. Después del último
cambio, en la posición 0 está el 1
que es la componente menor
El proceso se repite ahora para
1 3 5 6 2 colocar la componente menor en
la posición 1,luego en la 2, etc..
Ordenación por el método de la burbuja
 Un método de ordenación muy popular es el denominado “Algoritmo de la
burbuja”.
 El nombre deriva de la idea de que se compara una componente con todas las
siguientes de forma que si es mayor se intercambian. Esto hace que la
componente mayor “flote” como una burbuja y se sitúe en la última posición
del array (suponiendo una ordenación creciente).
 En la primera iteración del algoritmo, se sitúa en la última posición la
componente mayor, en la siguiente se sitúa en la penúltima posición la
componente mayor de las restantes, etc.
Método de la burbuja
3 2 5 6 1

Compara la componente 0 y 1, como 3 es mayor que 2 las intercambia

2 3 5 6 1

Compara la componente 1 y 2, como 3 es menor que 5 no las intercambia

2 3 5 6 1

Idem, no las intercambia El proceso se repite ahora para


colocar la componente mayor
2 3 5 1 6 en la posición 3ª, 2ª, etc.

Después del último cambio, en la posición 4 está el 6 que es la componente mayor


Algoritmo de la burbuja con test de comparación
 El algoritmo de la burbuja es bastante eficiente si el array está muy
desordenado; en caso contrario, sigue dando vueltas aunque en la primera
iteración ya haya quedado ordenado.

2 3 6 5 8

Compara la componente 2 y 3, como 6 es mayor que 5 las intercambia


2 3 5 6 8

El array ya está ordenado en la primera iteración, pero el proceso


continúa hasta el final ya que el for más externo no puede parar
Una mejora consiste en poner una variable tipo switch que indique si
en una iteración ha habido intercambio, en cuyo caso, se procede a una
nueva vuelta del bucle.En caso contrario, el array ya está ordenado y el
bucle debería terminar.
Elcontrol de esta variable lo lleva el bucle más externo, aunque el
cambio se realiza en el bucle más interno.
1.13.- Búsqueda en un array
 Una operación muy común es buscar un elemento dentro de un array, para lo
cual hay varios métodos:
◦ Búsqueda secuencial: recorre el array desde el principio hasta que lo
encuentra o hasta que el array termina. Es obligatorio cuando el array no está
ordenado.
◦ Búsqueda binaria o dicotómica: es recomendable si el array está
ordenado.
El proceso consiste en comparar el elemento buscado con el elemento que se
encuentra en la posición central del array. Si fuera ese el elemento
buscado, el proceso terminaría. En caso contrario, se compara el elemento
con la componente central. Si el elemento es menor que ésta, la búsqueda
se reduce a la mitad izquierda del array; si no, a la mitad derecha. En
ambos casos, se repite el proceso hasta que el elemento se encuentre o
hasta que no se pueda seguir dividiendo el array lo que significa que el
elemento buscado no está en el mismo.
Este proceso es más rápido que la búsqueda secuencial.
 Se puede hacer más eficiente si al elegir la mitad izquierda o derecha del
array se desprecian los elementos medios que ya se han evaluado.
 Se deduce que el elemento no está en el array si el limite inferior es mayor
que el superior (los límites se solapan).
Elemento a buscar=4

LIMITE INFERIOR MEDIO LIMITE SUPERIOR

1 2 3 4 6 7 8 9 10 11
Compara el elemento a buscar (4) con la componente central (6). Como
es menor, la búsqueda se restringe a la mitad izquierda
MEDIO
LIMITE INFERIOR LIMITE SUPERIOR

1 2 3 4 6
Compara el 4 con la componente central (3), como es mayor la búsqueda
se restringe a la mitad derecha
MEDIO
LIMITE INFERIOR LIMITE SUPERIOR

3 4 6 Elemento encontrado
MATRICES: ARRAYS
BIDIMENSIONALES
1.8.- Arrays Multidimensionales o Matrices

 Un array multidimensional o matriz es un array de arrays, que podríamos


representar como una tabla de n filas por m columnas pero puede ocurrir
que cada array componente, es decir cada fila, tenga distinto tamaño ,
distinto numero de elementos..
 Para crear arrays de 2 dimensiones (bidimensional) haremos de forma
similar que uno de una dimension:
int datos[ ][ ]= new int [8][8]; // matriz de 8*8= 64 enteros divididos en
8 filas de 8 columnas
int datos[ ][ ]= new int[5][8]; //matriz de 5 filas y 8 columnas
 También se puede hacer la inicialización del array en el momento de la
declaración de la forma siguiente:
int datos[ ][ ]= {{1,4,5},{6,2,5}}// crea un array bidimensional de 2 filas
y 3 columnas
 Debemos pensar que vamos a necesitar dos índices para poder especificar
la fila y la columna donde esta un determinado elemento
 Tomando uno de los ejemplos que hemos visto el número de filas, en este tipo
de arrays de dos dimensiones, viene dado por datos.length y el número de
columnas por datos[0].length
1.9.- Recorrido del array multidimensional
1.10.- Arrays con componentes de distinto tamaño
 Aunque lo normal en un array bidimensional es que todas las filas contengan
el mismo número de columnas, en Java es posible definir arrays de arrays con
componentes distintas.
 La instanciación de los arrays multidimensionales puede realizarse por partes:
creando primero el array y después sus componentes
Se crea sin
contenido más tarde se asocia a arrays reales,
nuevos o ya existentes
matriz[4][] matriz

null int[4]
matriz[0]=new int[4];
null matriz[1]=pp; ?
5 ?
null null ?
4
?
null null 8
2 un array
7 nuevo
6
9

pp (array ya
existente)
CADENAS DE CARACTERES: STRINGS
1. La Clase String
• La clase String se utiliza para manejar cadenas de caracteres de cualquier
longitud finita.
• La clase String es una clase especial con soporte específico incluido en el
lenguaje Java
• Para crear un objeto String no hace falta llamar al constructor sino que basta
escribirlo como un valor
• El estado interno de una instancia de tipo String es una secuencia de caracteres
encerrados entre comillas. Una variable de tipo String nombra a una secuencia
de este tipo.
• Los objetos de tipo string se declaran, crean e inicializan de la siguiente forma:

String nombre; // crea una variable de tipo String


String cad = ”Buenas buenas …”; // crea un objeto String y lo asigna a la variable “cad”
• También se podría poner de esta forma:
String cad = new String (”Buenas buenas …”);  tiene 16 caracteres
pero sería lo mismo por lo que en principio no tiene sentido hacerlo
• Podemos ver en internet todos los métodos de la clase String
2. La Clase String: sus métodos
Los principales métodos de la clase String son:
length(): devuelve la cantidad de caracteres de una cadena.
toLowerCase():devuelve la misma cadena pero con los caracteres en minúscula.
toUpperCase(): devuelve la misma cadena pero con los caracteres en
mayúscula.
trim(): devuelve la misma cadena pero sin espacios (al principio y al final).
charAt (int pos): devuelve el carácter que está en la posición que corresponde al
indicado por pos.
substring (int inicio): devuelve la subcadena a partir de inicio.
substring (int inicio, int fin): devuelve la subcadena a partir de la posición
inicio hasta la anterior a la posición fin.
indexOf(String a): devuelve la posición de la primera aparición de la subcadena
a en la cadena.
indexOf(String a, int pos): devuelve la posición de la primera aparición de la
subcadena a en la cadena a partir de la posición pos.
lastIndexOf(String a): devuelve la posición de la última aparición de la
subcadena a en la cadena.
Veamos lo que devuelven las funciones aplicadas a la variable cad
 cad.length() devuelve 16.
 cad.toLowerCase(): devuelve ”buenas buenas…”.
 cad.toUpperCase(): devuelve ”BUENAS BUENAS…”.
 cad.trim(): devuelve ”Buenasbuenas…”.
 cad.charAt (1): devuelve ’u’.
 cad.charAt (100): devuelve
StringIndexOutOfBoundsException:
String index out of range: 100 (in java.lang.String)
 cad.substring (3): devuelve ”nas buenas…”.
 cad.substring (3,5): devuelve ”na”.
 cad.substring (3,25): devuelve
StringIndexOutOfBoundsException:
String index out of range: 25 (in java.lang.String)
 cad.indexOf(”Bue”): devuelve 0.
 cad.indexOf(”bUe”): devuelve -1.
 cad.indexOf(”bue”,6): devuelve 7.
 cad.lastIndexOf(”bue”): devuelve 7.
• Los métodos substring y indexOf reciben como argumento un índice. En Java
el mínimo valor para un índice es 0 (es decir, la primera posición de una cadena
en Java, como en arrays, es 0).
• Los métodos indexOf y lastIndexOf retornan –1 si la subcadena no aparece en
la cadena.
• La comparación no se realiza a través del operador relacional ==.
• Para convertir un número en una cadena de caracteres se emplea el método
valueOf (conversión explícita):
int valor = 10;
String str = String.valueOf (valor);
• La clase String proporciona versiones de valueOf para convertir los datos
primitivos: int, long, float, double.
• Para convertir una cadena en un número entero, primero quitamos los
espacios en blanco al principio y al final y usamos el método parseInt de
la clase Integer que describirá más adelante.
String str = " 12 ";
int numero = Integer.parseInt (str.trim());
• Para convertir una cadena en número decimal se requieren dos pasos:
Convertir la cadena en un objeto de la clase Double, mediante el método
valueOf (eliminando previamente los espacios en blanco).
A continuación convertir el objeto de la clase Double en un tipo primitivo
double mediante el método doubleValue.

String str = "12.35";


double num = Double.valueOf(str.trim()).doubleValue();

También podría gustarte