Unidad Didáctica 5 Arrays, Cadenas y Vectores Tipos Genéricos Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión 1.2.1 Introducción Según lo visto hasta ahora “¿Cómo representaría N vectores en el espacio 3D?”: Integer v1_x=1, v1_y=4, v1_z=6; Integer v2_x=7, v2_y=3, v2_z=5; … Y v2 v1 Z Todo L.P. hace posible agrupar varios valores en una misma variable Al reducir el nº de variables los programas son más fáciles de desarrollar, entender y, por tanto, mantener Integer[ ] v1 = {1, 4, 6}; Integer[ ] v2 = {7, 3, 5}; … UD5: Arrays, Cadenas y Vectores. Tipos Genéricos X Arrays: definición Un array es un conjunto finito de elementos del mismo tipo almacenados en posiciones consecutivas de memoria. Dado que: A y B hacen posible el acceso directo a los elementos de un array. El acceso directo permite acceder y modificar cualquier elemento del array del mismo modo que una variable independiente. El acceso directo en los arrays se lleva a cabo por indexación mediante el operador corchete: [ ] Cada elemento de un array de tamaño N tiene asociado un índice: A: Todos los elementos de un mismo tipo “requieren” los mismos bytes. B: Siempre se conoce la dirección de memoria de una variable. El primer elemento tiene índice 0 y el último tiene índice N–1 Los arrays pueden contener elementos de cualquier tipo, arrays inclusive. Un array es un objeto y su tamaño no puede cambiarse tras crearse. UD5: Arrays, Cadenas y Vectores. Tipos Genéricos Arrays: inicialización int[ ] v1 = {2, 34, 5}; /* v1 es un array con 3 elementos de tipo básico int: el primer elemento es 2, el segundo es 34 y el tercero es 5 */ Integer[ ] v2 = new Integer[7]; // v2 es un array vacío con capacidad para 7 elementos de tipo objeto Integer double[ ] v3; // v3 es un array de elementos de tipo básico double Diferencias entre v1, v2 y v3: • • • v1 está inicializado (“tiene valores”) v2 no está inicializado (“no tiene valores”) v3 no es un array “todavía” (v3==null) UD5: Arrays, Cadenas y Vectores. Tipos Genéricos Arrays: operaciones Suponiendo: int[ ] v1 = {2, 34, 5}; Integer[ ] v2 = new Integer[7]; Acceso a un elemento: Modificación de un elemento: int x = v1[0]; // x==2 Integer y = v2[0] ; // y==null (NULO, SIN VALOR) x=v1[-2]; y=v2[7]; MAL (ArrayIndexOutOfBoundsException) v2[0] = v1[1]; // Autoboxing Consultar el tamaño: int tams = v1.length + v2.length; // tams es una variable de tipo básico int inicializada con el valor 10 (3+7) UD5: Arrays, Cadenas y Vectores. Tipos Genéricos Arrays de dos dimensiones int[ ][ ] m1 = {{3, 7, 4}, {2, 5, 9}}; /* m1 es un array de arrays que alberga 2 arrays con 3 elementos int cada uno. m1 representa a una matriz rectangular de enteros con 2 filas y 3 columnas */ int x = m1[0][1]; // x==7 Integer[ ][ ] m2 = new Integer[7][ ]; // m2 es una matriz que tendrá 7 filas, pero ninguna fila está creada todavía m2[3] = new Integer[8]; // la cuarta fila de m2 está creada pero no está inicializada Integer y = m2[3][6]; // y==null, no existe el elemento y = m2[5][1]; MAL (ArrayIndexOutOfBoundsException) UD5: Arrays, Cadenas y Vectores. Tipos Genéricos Arrays de objetos tablaPuntos [0] = new PuntoImpl(1.0,1.0); tablaPuntos [1] = new PuntoImpl(1.0,2.0); tablaPuntos [2] = new PuntoImpl(1.0,3.0); tablaPuntos [3] = new PuntoImpl(1.0,4.0); tablaPuntos 1.0 1.0 1.0 2.0 1.0 3.0 1.0 4.0 2.0 5.0 tablaPuntos [3] = new PuntoImpl(2.0,5.0); tablaPuntos = new PuntoImpl[5]; UD5: Arrays, Cadenas y Vectores. Tipos Genéricos String Representan cadenas de caracteres Clase perteneciente al lenguaje (paquete java.lang) ENCAPSULA un array de elementos de tipo char y le añade funcionalidad Los objetos de tipo String son INMUTABLES La clase String no puede tener clases hijas Un literal (valor) String es toda secuencia de caracteres UNICODE encerrada entre dobles comillas (“…”) UD5: Arrays, Cadenas y Vectores. Tipos Genéricos String: ejemplo de uso Inicialización: Consultar el número de caracteres: int tam = saludo.length(); // tam==4 Pasar a mayúsculas: String saludo = “Hola”; String s2 = saludo.toUpperCase(); //”HOLA” Comparar dos cadenas: boolean iguales = saludo.equals(s2); //iguales==false UD5: Arrays, Cadenas y Vectores. Tipos Genéricos String: métodos de uso frecuente public final class String … { public int length( ) {…} public char charAt(int i) {…} public String concat(String s) {…} public boolean contains(CharSequence s) {…} public int indexOf(int c) {…} public String substring(int i1, int i2) {…} public String replace(char c1, char c2) {…} public String trim( ) {…} public String toLowerCase( ) {…} public String toUpperCase( ) {…} …. public boolean equals(Object o) {…} } UD5: Arrays, Cadenas y Vectores. Tipos Genéricos Vector Clase perteneciente al paquete java.util (IMPORTAR) ENCAPSULA un array de OBJETOS y le añade funcionalidad. Los vectores tienen capacidad "ilimitada" Los vectores no pueden albergar tipos básicos. Todos los elementos de un vector deben ser del mismo tipo: O bien ser creados todos con la misma clase, O bien ser creados con clases que implementen una interfaz común. UD5: Arrays, Cadenas y Vectores. Tipos Genéricos Vector: ejemplo de uso Inicialización: Consultar el número de elementos: Double x = v.get(1); // x==2.7 Modificar un elemento según su índice: v.add(0, 4.9); Obtener un elemento según su índice: v.add(2.7); Añadir un elemento al principio: int tam = v.size(); // tam==0 Añadir un elemento al final: Vector<Double> v = new Vector<Double>(); v.set(1, 3.5); Comprobar si contiene un elemento: boolean contiene = v.contains(2.7); //contiene==false UD5: Arrays, Cadenas y Vectores. Tipos Genéricos Vector: métodos de uso frecuente public class Vector<T> ... { public Vector( ) {…} public int size( ) {…} public T get(int index) {…} public T set(int index, T element ) {…} public boolean add(T element ) {…} public void add(int index, T element ) {…} public boolean isEmpty( ) {…} public boolean contains(Object o) {…} public int indexOf(Object o) {…} … public boolean equals(Object o) {…} } UD5: Arrays, Cadenas y Vectores. Tipos Genéricos Tipos genéricos: concepto Un parámetro genérico T representa a un tipo conocido en la definición de una clase o interfaz public class Vector<T> ... { private T[ ] elems; public class TestGenerico extends Test { public Vector( ){…} public static void main(String[] args) { Vector<Integer> v; public T get(int index) {…} v.add(6); public T set(int index, T element ) {…} mostrar(v); public boolean add(T element ) {…} } T element ) {…} public void add(int index, } … } Los parámetros genéricos deben sustituirse por tipos concretos para poder usar objetos de tal clase o interfaz UD5: Arrays, Cadenas y Vectores. Tipos Genéricos Tipos genéricos: sintaxis Si una interfaz tiene métodos genéricos se indica con <*> tras su nombre Si una clase tiene atributos genéricos se indica con <*> tras su nombre * = Un solo tipo genérico se indica con T, varios tipos genéricos se indican con T1, T2,T3, … interface Comparable<T> { int compareTo(T e); } public class ParejaImpl<T1,T2> { private T1 e1; private T2 e2; … } UD5: Arrays, Cadenas y Vectores. Tipos Genéricos Tipos genéricos: sintaxis Si una clase no tiene atributos genéricos pero implementa métodos genéricos, estos se indican tras sus modificadores public class TestGenerico2 extends Test { public class Utiles { public static void main(String[] args) { … Integer x = 3; public static <T> Vector<T> aVector(T a) { String s = "Hola"; Vector<T> v = new Vector<T>(); Vector<Integer> v1 = Utiles.aVector(x); v.add(a); Vector<String> v2 = Utiles.aVector(s); return v; mostrar(v1); } mostrar(v2); … } } } En un método genérico al menos uno de sus parámetros o su tipo de retorno pueden cambiar en distintas llamadas al método UD5: Arrays, Cadenas y Vectores. Tipos Genéricos Tipos genéricos: sintaxis Un atributo genérico se concretará al crear o instanciar un objeto de la clase a la que pertenece el atributo public class ParejaImpl<T1,T2> … { private T1 e1; private T2 e2; … } public class TestGenerico3 extends Test { public static void main(String[] args) { Pareja<Integer, String> p = new ParejaImpl<Integer, String>( ); … } } UD5: Arrays, Cadenas y Vectores. Tipos Genéricos Tipos genéricos: consideraciones Los operadores con un tipo como operando NO admiten tipos genéricos. Ejemplo: instanceof NO es posible: constructores de un tipo T Inicializar arrays de un tipo T a instanceof Vector a instanceof Vector<T> a instanceof T T a = new T( ); T[ ] = new T[10]; T a = (T) new Object(); // bien (tipo crudo) // mal // mal // mal // mal // warning UD5: Arrays, Cadenas y Vectores. Tipos Genéricos