Está en la página 1de 38

POO – Java

Clase 2
 Strings
 Arreglos: vectores y matrices.
 Containers
 Enumeraciones
 Entrada/Salida (I/O Streams)
 Serialización

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 1


Strings
• Un string es una secuencia o cadena de caracteres.
• La clase String representa todos los strings en Java.
• Para comparar strings debe usarse el metodo equals()
• Es una clase inmutable (no puede cambiarse)
• Para cambiar los contenidos de un String puede usarse la clase
StringBuilder
public String invertir(String s) {
StringBuffer sb = new StringBuilder();
for (int i = s.length() - 1; i >= 0; i--)
sb.append(s.charAt(i));
return sb.toString();
}
UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 2
Strings: operaciones básicas
• Saber la longitud de un string:
int length(); String str = “Mardel";
int len = str.length();

• Retornar un substring de un string:


String substring String str = "Mardel";
(int beginIndex, String sub =
int endIndex); str.substring(2,4);

• Retornar la posición de un substring de un string (y el de la


última ocurrencia):
int indexOf (String str); int index =
int lastIndexOf str.indexOf(“de");
(String str);
UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 3
Strings: otras particularidades
• Desde tipos primitivos, usar String.valueOf():
String siete = String.valueOf(7);

• Igualmente, existe una versión sobrecargada de


System.out.println() para cada tipo primitivo:
int cantidad = 7;
. . .
System.out.println(cantidad);

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 4


Strings desde objetos
• Para producir strings desde otro objeto, utilizar el método
toString(), y sobreescribirlo en las clases que se
implementen, si es necesario.
Este método es llamado automáticamente por
System.out.println() para cualquier objeto
public class Pelicula {…
public String toString() {
return nombre + " (" + anio + ")";
}…

• Documentación API: https://docs.oracle.com/javase/8/docs/api


/java/lang/String.html

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 5


Arreglos
• Creando e inicializando vectores:
// Crea un array de cuatro Strings vacios
String[] arr = new String[4];
for (int i = 0; i < arr.length; i++) {
arr[i] = new String();
}
String[] categorias =
{"Accion", "Comedia", "Drama"};

• Creando una matriz de enteros:


int[][] mdarr = new int[4][2];
mdarr[0][0] = 1;
mdarr[0][1] = 7;

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 6


Arreglos y Excepciones
• Cuando un índice del arreglo es inválido se genera una
excepción ArrayIndexOutOfBoundsException:
//Esto genera ArrayIndexOutOfBoundsException
String[] lista = new String[4];
System.out.println(lista[5]);

• Cuando se intenta acceder a un elemento que no ha sido


inicializado se genera una excepción NullPointerException:
// Esto genera NullPointerException
Movie[] listaPelis = new Pelicula[3];
String director = listaPelis[0].getDirector();

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 7


Arreglos: generalidades
• Al único atributo de un array que puede accederse es a length que
indica su longitud.
• Se puede pasar un arreglo como parámetro (se pasa la referencia).
• Para copiar de un arreglo a otro se provee el método
System.arraycopy.
• En java.util se implementa la clase Arrays y se provee cierta
funcionalidad por medio de métodos estáticos:
– equals() compara dos arreglos.
– fill() permite llenar un arreglo con un valor determinado.
– sort() ordena el contenido de un arreglo.
– binarySearch() busca un elemento en el arreglo. El arreglo debe estar
ordenado.

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 8


Containers
• Parte del Java Collections Framework.
• Permiten contener objetos. Conceptualmente se dividen en dos
tipos:
– Collection: un grupo de elementos individuales.
• Una lista (List) contiene los elementos en una secuencia
particular.
• Un conjunto (Set) no puede tener elementos de tipo
repetido.
– Map: almacena un grupo de pares de objetos clave-valor.
Son arreglos asociativos.

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 9


Containers: ejemplos métodos con ArrayList
• Crear una lista vacía, con una capacidad inicial de 10
ArrayList miembros = new ArrayList();

• Crear una lista con la capacidad inicial especificada


// La lista puede expandirse luego.
ArrayList miembros = new ArrayList(40);

• Agregar un elemento al final de una lista


miembros.add(nuevoSocio);

• Agregar un elemento en una determinada posición


// Inserta al principio
miembros.add(0, nuevoSocio);
UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 10
Containers: ejemplos métodos con ArrayList
• Eliminar un elemento de una determinada posición
// Borra el primer elemento
miembros.remove(0);

• Eliminar todos los elementos


miembros.clear();

• Obtener un elemento de una posición especificada


miembroActual = miembros.get(5);

• Buscar un elemento en una lista


int posicion = miembros.indexOf(miembroBuscado);

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 11


Containers - Ejemplo
import java.util.*;

public class MostrandoContenedores {


static Collection llenar(Collection c) {
c.add(“perro");
c.add(“perro");
c.add(“gato");
return c;
}
static Map llenar(Map m) {
m.put(“perro", "Bosco");
m.put(“perro", "Spot");
m.put(“gato", "Rags");
return m;
}
public static void main(String[] args) {
System.out.println(llenar(new ArrayList()));
System.out.println(llenar(new HashSet()));
System.out.println(llenar(new HashMap()));
}
}
UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 12
Containers: tratamiento objeto almacenado
• Con “Generics” (JSE5)
– Implementar seguridad de tipos en tiempo de compilación.
– También conocido como polimorfismo paramétrico o plantillas. Permite
que un objeto pueda usarse uniformemente como parámetro en distintos
contextos o situaciones.
– En estas clases el tipo concreto de datos que manipulan se especifica
como un parámetro en el momento en que se crean los objetos de la
clase.
• Como Objects
– No se tiene certeza sobre qué tipo de objeto se tiene almacenado.
– Los containers guardan referencias a objetos de la clase Object que es la
clase raíz de Java.
– Se debe realizar un cast al objeto al momento de utilizarlo.
(Ver Ejemplo en Clase 2 – Referencias)
UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 13
Containers: iterators
• Iterator
– Objeto cuya función es moverse recorriendo una secuencia de objetos, sin
importar el tipo de contenedor que es.
– Modo de recuperar y eliminar objetos de un container a un nivel de
abstracción donde, si por razones de eficiencia, se cambia el tipo de
container, no es necesario reescribir el código.
– Con un iterator se puede:
• Avisarle al container que se desea usar un iterator, por medio del
método iterator() El iterator estará listo para recuperar el
primer elemento de la secuencia cuando invoque a next().
• Traer el próximo elemento de la secuencia con next().
• Ver si hay más elementos en la secuencia con hasNext().
• Eliminar el último elemento accedido, con remove().
(Ver Ejemplo en Clase 2 – Referencias)
• ListIterator
– Iterador para Listas, agregando iteración bidireccional, reemplazo e
inserción de elementos, y devolución de índice o posición.
UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 14
Containers: Taxonomía

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 15


Containers: Taxonomia
• Depurando…….

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 16


Containers: ArrayList vs. LinkedList
• Diferentes implementaciones internas: ArrayList como un
arreglo, mientras que LinkedList como una lista doblemente
enlazada.
• Esto influye en el rendimiento (buscar coste constante, eficiente
e independiente del tamaño de la lista).
• ArrayList es conveniente para reiteradas operaciones de acceso
aleatorio o búsquedas.
• LinkedList es favorable para frecuentes operaciones de borrado
o inserción.

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 17


Containers: orden y comparación
• Para comparaciones y ordenamiento de los objetos contenidos algunos de
los containers utilizan los métodos equals() (de Object) y
compareTo() (de implementar interface Comparable) de los objetos
contenidos (“orden natural”).
• Se recomienda que ambos métodos sean consistentes entre sí
• Para ordenamientos alternativos al “orden natural” de los objetos, existe la
interface Comparator.
• En colecciones implementadas con hash (ej. HashSet) es imprescindible
que el método hashCode()sea consistente con el método equals()
• TreeSet representa un conjunto ordenado de objetos. Permite operaciones
más eficientes. TreeMap ordena los objetos por la clave. (Ver ejemplos en
Clase 2 – Referencias)

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 18


Containers: otras clases
• Existen para los contenedores: vistas, versiones de sólo lectura,
así como versiones sincronizadas para accesos concurrentes.
Se aplican wrappers (patrón decorador).
List list = Collections.synchronizedList(
new ArrayList());

• También cuenta con pilas, colas, colas con prioridad, mapas de


listas, listas secuenciales, colecciones cuyos elementos son
referencias débiles que pueden ser reclamados por el
GarbageCollector si la máquina virtual se está quedando sin
memoria, y un largo etcétera.

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 19


Inferencia de tipos para Generics (JSE7)
• Permite conjunto vacío de parámetros de tipo (“diamond”)

Map<String, List<String>> myMap =


new HashMap<>();

• Versiones anteriores…

Map<String, List<String>> myMap =


new HashMap<String, List<String>>();

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 20


Bucle For mejorado (for-each) (JSE5)
• Alternativa al uso de Iterators

for (String elemento : arreglo) {


....
}

• En versiones anteriores…

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


String elemento = arreglo[i];
....
}

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 21


Número Variable de Argumentos (JSE5)
int sum(Integer... numbers) {
   int mysum = 0;
   for(int i: numbers)
    mysum += i;
   return mysum;
}

// invocacion
sum(12,13,20);

• Sólo puede haber un argumento variable en un método.


• El argumento variable tiene que ser el último del método.
• Es posible no proporcionar valor alguno para el argumento variable.
Una clara aplicación del paso de parámetros variables a un método es la
implementación de System.out.printf (similar a C)
int x = 5; int y = 6; int sum = x + y;
System.out.printf("%d + %d = %d\n", x, y, sum);
UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 22
Enumeraciones (JSE5)
• Constantes con más sentido.
• Son objetos iterables
– métodos getValues(), toString(), ordinal(), compareTo, etc.

enum Estado{OK, SUSPENDIDO, PENDIENTE};


Estado status = Estado.OK;

• En versiones anteriores…

public static final int ESTADO_OK = 0;


public static final int ESTADO_SUSPENDIDO = 1;
public static final int ESTADO_PENDIENTE = 2;

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 23


Enumeraciones - Particularidades
• Las únicas instancias de un tipo enumerado son las que se crean
en su definición.
– No tienen constructor público.
– Las instancias son inmutables.
– No es posible extender un tipo enumerado: final por definición
– Es seguro comparar instancias con el comparador ==.
• Los valores enumerados de un tipo son ordinales, mantienen el
orden de su declaración en la definición del tipo.
– Implementan la interfaz Comparable.
– Implementan el método ordinal() que devuelve un entero reflejando la
posición del valor. Primer valor (posición = 0). Poco utilizado.
– Implementan el método values() que devuelve un arreglo con todos los
valores del tipo ordenados.
– Implementan el método toString() que devuelve el nombre del valor.
24
También implementa el método estático valueOf() que hace lo contrario.
UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java
Streams
• Un stream (flujo) es la abstracción de cualquier fuente y/o
destino de Entrada/Salida.
• ¿Qué pueden ser streams ?
– Consola (Teclado)
– Archivo
– Pipe
– Red
– Memoria
• Modelo programático
open stream;
while (hay datos) do
(read | write) datos;
close stream ;

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 25


Clases de E/S
• Las librerías de E/S están divididas en input y output.
• En general todas las clases derivan de InputStream y
OutputStream
. (Ver diagrama en Clase 2 – Referencias)
• Reunidas en paquetes java.io y java.nio
• Soporta desde streams de bytes hasta streams de objetos,
pasando por streams de caracteres y de tipos primitivos (data).
• Permite manejar buffers para optimizar la gestión de los streams.

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 26


Lo básico: Standard Output
Comprendiendo System.out.println()
• No existe un package llamado System con una clase out y un método
println().
• System es una clase que tiene una variable de clase (estática)
denominada out que es un objeto de tipo PrintStream
• PrintStream es una implementación de la clase abstracta
OutputStream
• out es un PrintStream que permite
– onvertir caracteres (almacenados en Unicode) a bytes de acuerdo a la
codificación de caracteres que tenga cada plataforma.
– Finalizar una línea
– Hacer un flush: forzar explícitamente al sistema operativo a mostrar los datos,
liberando el buffer.

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 27


Lo básico: Standard Input
• El Standard Input está representado por System.in.
• in es un objeto InputStream que provee capacidad limitada de
lectura a través del método read().
• in no permite:
– Leer una línea por vez
– Leer un tipo primitivo , tal como un double (el motivo es que el método
read() permite leer solamente de a un byte).
• in puede ser util para detener un programa (por ej. para
debugging)
try {System.in.read();} catch ...

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 28


Leer una línea
• Cuando se desea leer una línea entera tipeada desde consola,
se debe utilizar un wrapper de System.in.
• La clase BufferedReader es un wrapper para
InputStreamReader (provee un método readLine)
import java.io.*;
public class Aplicacion1 {
public static void main(String[] args) {
BufferedReader in = new BufferedReader (new
InputStreamReader(System.in));
String s;
try {
while((s = in.readLine()).length() != 0)
System.out.println(s);
} catch(IOException e) {}
}}
UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 29
Lectura de datos con Scanner (JSE5)
• Permite separar en subcadenas o “tokens” los datos de
entradas, pasándolos luego a tipos primitivos, análogamente a la
clase StringTokenizer.
Scanner sc = new Scanner(System.in);
String cadena = sc.nextLine();
int entero = sc.nextInt();
int enteroHexa = sc.nextInt(16);

• Scanner tiene constructores sobrecargados que admiten,


además de la entrada estándar (System.in), secuencias de bytes
o archivos.

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 30


Lectura de datos con Scanner (JSE5)
• Admite expresiones regulares como patrones de búsqueda,
permitiendo leer trozos de línea directamente usando diferentes
separadores o buscando expresiones concretas.
// Ingresa: 11:33:44, obtiene números 11, 33 y 44
Scanner sc = new Scanner(System.in);
// Delimitador dos puntos, o bien cualquier
// espacio/fin de línea (el \\s)
sc.useDelimiter("[:\\s]");
int a = sc.nextInt();
int b = sc.nextInt();
int c = sc.nextInt();
System.out.println(a +"-"+ b +"-"+ c);

(Ver ejemplos en Clase 2 – Referencias)


UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 31
Filters
• Decorator pattern: uso de objetos en capas a fin de agregar funcionalidad a
una clase ya existente.
• Las clases que aplican este patrón sobre InputStream y
OutputStream son FilterInputStream y
FilterOutputStream. Son clases abstractas derivadas de aquellas.
• Permiten leer y escribir tipos primitivos y objetos String de manera más
portable.
• Posibles usos de filtros son:
– Respetar el tipo de los datos (double, int, etc.)
– Buffering
– Proveer números de línea.
• Ambas clases son derivadas por otras clases a fin de brindar la misma
funcionalidad.

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 32


Escritura y lectura de archivos
• Para leer de un archivo de texto utilizar FileReader como
wrap de String (nombre de archivo)
• Para escribir en un archivo de texto Usar FileWriter
haciendo wrap con BufferedWriter y PrintWriter
• Para leer de un archivo de datos usar FileInputStream
haciendo wrap con BufferedInputStream y
DataInputStream
• Para escribir en un archivo de datos usar
FileOutputStream haciendo wrap con
BufferedOutputStream y DataOutputStream

(Ver ejemplos en Clase 2 – Referencias)

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 33


Acceso random a archivos
• A diferencia de los archivos secuenciales, se puede necesitar la
capacidad de acceder aleatoriamente a distintas porciones de un
archivo.
• La clase RandomAccessFile permite:
– Posicionarse en en cualquier punto del archivo, usando el método
seek().
– Colocar o leer información en ese punto.
– Calcular el tamaño del archivo.
• La posición se expresa en bytes

(Ver ejemplos en Clase 2 – Referencias)

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 34


La clase File (java.io)
• Es utilizada para representar el nombre de un archivo o un
conjunto de ellos (directorio). Provee una abstracción
independiente de la plataforma.
File f1 = new File("/"); // root
File f2 = new File("/etc", "passwd");
File f3 = new File("config.sys");

• Permite obtener atributos de un archivo:


– Saber si el archivo existe, si es de lectura, o si es de lectura/escritura
– Cuándo fue su última modificación, su tamaño.
• Se pueden crear y eliminar archivos.

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 35


La clase File
• El método list() en un objeto File devuelve una lista de
nombres de archivos cuando el objeto es un directorio (retorna
un arreglo de String)
• La interface FileNameFilter es usada para recuperar un
subconjunto de archivos. Esta interface solamente declara el
método accept().
• Para obtener un subconjunto (subset):
– Pasar un objeto que implemente la interface FileNameFilter al método
list().
– La implementación requiere el método accept() en FileNameFilter para
que sea completa. Provee un método que al ser llamado por list() indica
los elementos que deben ir en la lista (el criterio de filtrado).
(Ver ejemplo en Clase 2 – Referencias)
UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 36
NIO.2 (JSE7)
• Provee soporte adicional para el sistema de archivos, y supera
falencias de java.io, aunque no lo reemplaza. java.io es
necesaria para la manipulación de datos.
• Mejora la eficacia en la transmisión de datos empleando bloques
de datos en lugar de flujos de bytes (java.io).
• Incorpora buffers, canales y selectores.
• Algunas clases centrales son:
• Path: para manipular paths.
• Files: aporta operaciones de archivos como mover, copiar, borrar
y consulta o seteo de atributos.
• FileSystem: permite obtener información del sistema de archivos.

UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 37


Serialización
• Extiende las capacidades de las clases de E/S para objetos, de
modo tal que puedan ser enviados a un stream y luego ser
reconstruidos.
• Persistencia: la vida del objeto va más allá de un programa que
lo crea, dado que puede existir para diferentes invocaciones del
programa, en diferentes plataformas.
• La clase que se quiere hacer persistente debe implementar la
interface Serializable.
• Abstracción de la composición del objeto a serializar: la cantidad
y tipos de atributos de la clase es transparente para su escritura
y lectura.
(Ver ejemplos en Clase 2 – Referencias)
UCAECE Mdp – Algoritmos y Estructuras de Datos II - Java 38

También podría gustarte