2. Strings, Archivos y Arreglos

Slides:



Advertisements
Presentaciones similares
Arreglos Unidimensionales y Bidimensionales ESTRUCTURAS DE DATOS I
Advertisements

Curso de java básico (scjp)
Archivos de Texto. Introducción Los archivos son una secuencia de bits que se guarda en el disco duro. La ventaja de utilizar archivos es que los datos.
Curso de Java Capitulo 6: Cadenas y Arrays Profesor:
Definición de Clases y Variables de referencia.
Programación II Recursividad
Unidad 5 Listas Enlazadas Bibliografía: Algoritmos y Estructuras de datos de Aguilar y Martinez. Unidad 9 Autor: Ing Rolando Simon Titiosky.
ALGORITMOS DE ORDENAMIENTO
PROGRAMACION DE ESTRUCTURAS DE DATOS
PARADIGMA Es un esquema de pensamiento que nos lleva a concebir las cosas de una manera determinada. el término paradigma puede indicar el concepto de esquema.
Arreglos: Vectores en JAVA
Excepciones y archivos Info 033. Exception El término Exception es la palabra corta para la frase "evento excepcional." Definition: Una excepción es un.
CI TEORIA semana 8 Subprogramas o funciones Definición de funciones.
Métodos Algoritmos y Desarrollo de Programas I. Cuando utilizar métodos  Los métodos se utilizan para romper un problema en pedazos de forma que este.
COLAS, IMPLEMENTACIÓN A PARTIR DE LISTAS Y PARA PILAS
Clases y objetos La unidad fundamental de programación OO son las clases. Conjunto de métodos y semántica Qué se va a hacer POO Clase: que define la implementación.
Tema 6: Clases Antonio J. Sierra.
TÉCNICO EN PROGRAMACIÓN DE SOFTWARE Instructor: Ingeniero Adrián Guerrero Taborda
GRAFOS HUGO ARAYA CARRASCO.
Semana 5 Subprogramas..
C++ LISTAS C++ 11/04/2017 Ing. Edgar Ruiz Lizama.
UNIDAD 2:Crear, abrir y cerrar una base de datos Hacer clic sobre la opción Nuevo de la pestaña Archivo. Se mostrarán las distintas opciones para nuevos.
ESTRUCTURAS DE DATOS I Conocer, comprender y analizar algunos de los principales tipos de estructuras de datos.
Java. Java nació el año 1991, por un par de ingenieros de la Sun Microsystems.
Estructura de Datos y Algoritmos
Capítulo 1 “Elementos de Programación”
ESTRUCTURA DE DATOS EN JAVA
Estructuras de Datos Arreglos.
Clase 10: Estructuras de datos y arreglos.
Valor X Valor Y Punto (0,0) Coordenadas.
ELO3201 Contenedores Biblioteca Estándar de Templates Agustín J. González ELO320 Contenido Contenedores: Vector, List, Deque, Stack, Queue, Priority Queue,
2. Diagramas de Estado. ¿Qué es y para qué se usa? Una técnica para desarrollar programas Espacialmente adecuado para programas que tienen que analizar.
Material de apoyo Unidad 4 Estructura de datos
Ordenación y Búsqueda.
Recurrencia Programación II de enero de 2009.
Teoría – Alejandro Gonzalez
Computación I Primer Semestre 2006 Capítulo IV Ciclos y Colecciones (con un sabor a algoritmos)
COMP 250.  Ejemplo:  Suponer que se necesita codificar un programa donde se muestre como resultado el string “Bienvenidos al mundo de JAVA!!!” cien.
1. Desarrollo de Programas iterativos usando invariante
Estructuras de Control.
Problema de inclusión en una Curva Digital Por Orellana Muñoz, Alfonso Paz Vicente, Rafael Pérez Medina, Gerardo Rodríguez Naranjo.
Java.
Sentencias de repetición
IDENTIFICADORES Un identificador es un "nombre" que nos permite dirigirnos específicamente a una de las entidades propias del lenguaje, es decir, son los.
ELEMENTOS DE COMPUTACIÓN Profesor: Guillermo Figueroa
1 Asignación Dinámica de Memoria Agustín J. González ELO 329.
INTRODUCCION A LA PROGRAMACION
Fundamentos de Programación
Capítulo 2 “Subprogramas/Funciones - Arreglos”
ESTRUCTURAS REPETITIVAS
Estructuras de Decisión
“Análisis y Diseño de Algoritmos” 2a Entrega, Programa 6 Centro de Investigación y Estudios Avanzados del IPN Samuel Garrido Daniel 15-Abril-2004 México,
Metodología de Programación Ayudantía 4 lelagos.ublog.cl 2009.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Tipo.
PROGRAMACIÓN Grupo de Modelamiento de Sistemas
LENGUAJE DE PROGRAMACIÓN
LE, EI, Profesor Ramón Castro Liceaga UNIVERSIDAD LATINA (UNILA) V. GESTIÓN DE TIPOS Y GENERACIÓN DE CÓDIGOS.
ESTRUCTURAS DE DATOS “Conceptualización de estructuras de datos” Por: Eduardo Robayo.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Arreglo.
Tratamientos Secuenciales Generalizados II Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Unidad Didáctica 19 Versión
1 Métodos. 2 Un método es un conjunto de instrucciones definidas dentro de una clase, que realizan una determinada tarea y a las que podemos invocar mediante.
Métodos en Java. Estructura de un programa en Java ► La relación con la vida misma la podemos ver en el siguiente comentario: Imaginemos que dos clases.
Programación en Java Introducción a Java. Reseña histórica Surge en 1991 por Sun Microsystems Desarrollado para electrodomésticos Se buscaba un código.
UNIVERSIDAD TECNOLÓGICA DE PANAMÁ Facultad de Ingeniería de Sistemas Computacionales Programa de Lic. en Informática Educativa Computación.
ArreglosBidimensionales enjava. Sonestructurasdetamañofijoorganizadasporfilasy columnas. Estas estructuras almacenan valores del MISMO TIPO de dato. Cada.
3.6 Manejo de E/S Estructuras En la creación de soluciones para algunos problemas surge la necesidad de agrupar datos de diferente tipo o de manejar datos.
2. Arreglos e invariantes. Arreglos Un arreglo es una coleccion ordenada de elementos del mismo tipo – Tipos de datos primitivos (int, …) – Referencias.
Paso de parámetros Diseño de programas iterativos Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Unidad Didáctica 7 Versión.
2. Arreglos e invariantes
1. Desarrollo de Programas iterativos usando invariante
Transcripción de la presentación:

2. Strings, Archivos y Arreglos

Clase 7: Strings 2 de abril (N. Baloian)

Programa

Tipo Char

Caracteres y enteros import java.util.*; class Caracteres { public static void main(String args[]) { Scanner C = new Scanner(System.in); System.out.print("ingrese numeros n1 n2 "); int in = C.nextInt(), fn = C.nextInt(); for (int i = in; i <= fn; i++) System.out.println(i+" <-> "+(char)i); C.nextLine(); System.out.print("ingrese letras x1 Enter x2"); char ic = C.nextLine().charAt(0), fc = C.nextLine().charAt(0); for (int i = ic; i <= fc; i++) System.out.println(i+" <-> "+(int)i); }

Métodos de Strings

Más métodos

Apariciones de un string en otro

Ejemplos Conversión de un número a string String s = “”+n; //si n=123, s=“123” String s = “”+x; //si x=4.5, s=“4.5” Conversión de un string a número int i = Integer.parseInt(s); Double d = Double.parseDouble(s);

Los Archivos de Texto Se organizan en líneas de texto (Strings) Cada línea consiste una cadena de caracteres que termina con una marca de fin de línea Después de la marca de fin de línea de la última línea viene una marca de fin de archivo Por convención tienen la extensión .txt Se generan con un editor de texto (sin formato) o por un programa

Escribiendo archivos de texto Apertura de un archivo para escritura: PrintWriter x = new PrintWriter ( new FileWriter(filename)) Se pueden escribir líneas con los siguientes métodos: x.print(string) x.println(string) Si existía un archivo con ese nombre se borra y es reemplazado por el que genere el programa Es importante hacer que al final se ejecute la instrucción x.close() para asegurarse de que los datos que aún están en el buffer sean traspasados. Hay que reportar que se usan métodos que pueden causar excepciones con throws IOException

Ejemplo: escritura Leer líneas que terminan con la palabra “fin” y grabarlas en un archivo en disco de nombre “archivo.txt”. import java.io.*; import java.util.*; class CrearArchivo { static public void main(String[]args) throws IOException{ PrintWriter a=new PrintWriter( new FileWriter(“archivo.txt”)); Scanner U = new Scanner(System.in); while(true){ System.out.print (“linea(o fin)?“); String linea=U.nextLine() if( linea.equals(“fin”) ) break; a.println(linea); } a.close();

Leyendo archivos de texto en JAVA Abrir un archivo existente : BufferedReader x = new BufferedReader( new FileReader(filename)) Las líneas pueden ser leídas de la siguiente manera: String line = x.readLine() Archivos se tratan secuencialmente Si no quedan líneas por leer en el archivo, el método readLine() retornará el valor null. Importar clases BufferedReader y FileReader poniendo al import java.io.*; reportar excepciones con throws IOException

Ejemplo: lectura Leer líneas que terminan con la palabra “fin” y grabarlas en un archivo en disco de nombre “archivo.txt”. import java.io.*; class LeerArchivo{ static public void main(String[]args) throws IOException { BufferedReader a = new BufferedReader( new FileReader(“archivo.txt”)); while(true){ String linea=a.readLine(); if(linea==null) break; System.out.println(linea); } a.close();

Encontrar alumno con nota mayor Lineas en el archivo “archivo.txt”: Nombre:nota Ej. Juan Perez:6.7 import java.io.*; class LeerArchivo{ static public void main(String[] args) throws IOException { BufferedReader a = new BufferedReader( new FileReader(“archivo.txt”)); String linea; String nombre; double notamax = 0.0; while(linea=a.readLine() != null){ int i = linea.indexOf(“:”); double nota = Double.parseDouble(linea.substring(i+1)); if(nota > notamax) { notamax = nota; n nombre = linea.substring(0,i+1); } a.close(); System.out.println(“Nombre: “+nombre+” Nota: “+notamax);

Listar nombre de alumnos con nombre de los cursos inscritos Se tienen 3 archivos Alumnos.txt Inscripciones.txt Cursos.txt 1234 Juan Perez 1234 cc3001 cc3001 Algoritmos 2345 Ana Paiva 3456 cc1001 ma1101 Algebra 3456 Olga Diez 1234 ma2101 ma2101 Probabilidades 2345 cc3001 cc1001 Computacion 3456 ma1101 Resultado Juan Perez Algoritmos Probabilidades Ana Paiva Algoritmos Olga Diez Computacion Algebgra

Arreglos Un arreglo es una coleccion ordenada de elementos del mismo tipo Tipos de datos primitivos (int, …) Referencias a objetos El tamaño es definido en la creación (new) y no puede ser modificado

Arreglos de Tipos Primitivos int[] x; // equivalente a int x[] x = new int[3]; x[0] = 10; X 10 x[1] = 20; 20 30 x[2] = 30; Nota: x.length es una variable final que entrega el tamaño del arreglo

Arreglos de Objetos Circulo[] x; x = new Circulo[3]; Referencias X Circulo[] x; x = new Circulo[3]; x[0] = new Circulo(); x[1] = new Circulo(); x[2] = new Circulo();

Arreglos de Arreglos Java permite crear arreglos de arreglos con la siguiente sintaxis int[][] matriz = new int[4][]; for (int i = 0; i < matriz.length; i++) { matriz[i] = new int[5]; for (int j = 0; j < matriz[i].length; j++) { matriz[i][j] = i + j; }

Arreglos de Strings Paso de parámetros Static public void main(String[] args) { for (int i = 0; i < args.length; i++) { System.out.println(″Argumento ″+(i+1)+ ″ = ″+args[i]); }

Inicialización de Arreglos Un arreglo puede inicializarse con la siguiente sintaxis: boolean[] respuestas = {true, false, true}; String[] nombres = {"Ana María", "Carlos"}; String[][] humor = { { "Coco Legrand", "Alvaro Salas" }, { "Les Luthiers" }, { "Groucho Marx", "Buster Keaton", "Jerry Lewis", "Woody Allen" } };

for-each (desde Java 5.0) Java 5.0 introdujo un for simplificado para recorrer arreglos y otras estructuras El siguiente método retorna la suma de los elementos de un arreglo // Java 1.4 o anterior int sum(int[] a) { int result = 0; for (int i=0; i<a.length; i++) { result += a[i]; } return result; // Java 5.0 int sum(int[] a) { int result = 0; for (int i : a) { result += i; } return result;

Ejemplo: Búsqueda del máximo Estrategia: revisar todos los elementos a[1] hasta a[n] y registrar el mayor visto hasta ahora en m Invariante: m = max(a[1] … a[k]), 1 <= k<=n a1 a2 ai an an-1 . . . k

El invariante de una iteración Invariante: Alguna condición (conjunto) que describe lo que un ciclo hace. Permanece invariante durante el ciclo: al entrar, durante cada iteración y al final. Debería representar la estrategia que se usa para resolver el problema. Se usa para: -       A partir del invariante desarrollar el trozo de programa -       Demostrar que el trozo programa hace lo que queremos -       Explicar un trozo de programa Al escribir un ciclo se debe a) establecer la validez inicial del invariante, a través de una inicialización adecuada. B) El objetivo del ciclo es llegar a un estado final F. c) En cada iteración se debe, además, preservar la validez del invariante.

Condiciones iniciales y finales a) El invariante se debe cumplir antes de entrar al ciclo, pero no hemos revisado nada aún. Podemos decir que el primero es el mayor de los revisados hasta ahora m = a[1]; k = 1; a1 a2 ai an an-1 . . . k b) Para conseguir el objetivo, k debe valer n, por lo que debemos parar el ciclo cuando k = n, o continuarlo mientras k != n, o k < n a1 a2 ai an an-1 . . . k

Avanzar y restablecer el invariante c) Para avanzar hay que tratar de que k llegue a n. Esto se hace incrementando k. Esto puede significar que el invariante no se cumple pues el nuevo a[k] podría ser mayor que m. k++; Para restablecer el invariante podemos incluir en el ciclo las siguientes instrucciones (después de incrementar k) if (a[k] < m) m = a[k]; Ahora solo basta ensamblar a), b) y c) para tener el trozo de programa que hace lo que queremos a1 a2 . . . ai ai . . . an-1 an k

Ejemplo 1: ordenación por selección Este algoritmo se basa en hacer pasadas sucesivas sobre los datos. En cada pasada, se encuentra el máximo del arreglo, y se lo lleva al extremo derecho. Una vez hecho esto, ese elemento deja de ser considerado, porque se encuentra ya en su posición definitiva. Esto conduce al siguiente invariante: a[i] < a[i+1] para i = k hasta n-1 a[j] < a [i] con j = 0 hasta k-1, todos desordenados En palabras: "Los elementos desde k hasta n-1 ya están ordenados y son mayores que los primeros k".

Condiciones iniciales y finales Condiciones iniciales: al principio no se puede decir nada, por lo que se hace k = n, lo que dice que implica: a[i] < a[i+1] para i = n hasta n-1 (no existe elemento) a[j] < a [n] con j = 0 hasta n-1, todos desordenados (a[n] no existe) ¿Más comprensible?: al principio poner el mayor del arreglo en el lugar n-1 y hacer k = n-1 b) Condición final: k = 1 (o mientras k >= 2) a[i] < a[i+1] para i = 1 hasta n-1 a[j] < a [1] con j = 0 hasta 0, todos desordenados

Ord. X selección: avanzar y restablecer invariante // Ordenar a[0], ..., a[n-1] por selección  k = n; // inicialmente los n primeros están desordenados while( k>1 )  { --k; //acercar k a la meta, se rompe el invariante     Llevar el max de a[0], ..., a[k] hacia a[k]; //esto restablece el invariante   } Donde Llevar el max de a[0], ..., a[k] hacia a[k] => i = 0; // a[i] es el max hasta el momento for( j=1; j<=k; ++j )     if( a[j]>a[i] )         i = j;// ahora intercambiamos a[i] con a[k] t = a[i]; a[i] = a[k]; a[k] = t;

Ejemplo 2: ordenación por inserción Este algoritmo va construyendo un trozo ordenado del arreglo al extremo izquierdo, y en cada iteración le agrega un nuevo elemento a ese grupo. Invariante: a[i] < a[i+1] para i = 0 hasta k-1 a[k] hasta a[n-1] desordenados En palabras: "Los elementos desde 0 hasta k-1 ya están ordenados y los siguientes desordenados".

Condiciones iniciales y finales Condiciones iniciales: al principio se puede decir que el primer elemento a[0] está ordenado por definición, por lo que se hace k = 1, lo que implica: a[i] < a[i+1] para i = 0 hasta 1-1 a[1] hasta a[n-1] desordenados b) Condición final: k = n (o mientras k < n) a[i] < a[i+1] para i = 0 hasta n-1 a[n] hasta a[n-1] desordenados (no existe!)

Avanzar y restablecer invariante // Ordenar a[0], ..., a[n-1] por inserción  k = 0; // inicialmente el primer elemento esta ordenado while( k < n )  { ++k; //acercar k a la meta, se rompe el invariante Insertar a[k-1] entre a[0],...,a[k-2]; //esto restablece el invariante   } Donde Insertar a[k-1] entre a[0],...,a[k-2] => for( j=k-1; j>0 && a[j-1]>a[j]; --j )  {     // intercambiar a[j-1] con a[j]     t = a[j];    a[j] = a[j-1];    a[j-1] = t;

Optimización Al seguir el proceso de la inserción, se puede observar que la variable t toma siempre el mismo valor: el del elemento que se está insertando. Por lo tanto, se puede optimizar el programa realizando una única asignación a t antes de comenzar el ciclo. Otra observación es que la mayoría de las asignaciones a a[j-1] son inútiles, porque esa variable va a ser sobre-escrita en la iteración siguiente. Luego, se puede evitar esas asignaciones, reemplazándolas por una sola al final del ciclo: Insertar a[k-1] entre a[0],...,a[k-2] => // versión optimizada t = a[k]; for( j=k; j>0 && a[j-1]>t; --j )     a[j] = a[j-1]; a[j] = t;

Versión final optimizada (y algo variada) // Ordenar a[0],...,a[n-1] por inserción k = 1; // inicialmente primer elemento ordenado while( k < n )  {     // Insertar a[k] entre a[0],...,a[k-1]     t = a[k];     for( j=k; j>0 && a[j-1]>t; --j )         a[j] = a[j-1];     a[j] = t;     ++k;  }

Ejemplo 2: ordenación por selección Este algoritmo se basa en hacer pasadas sucesivas sobre los datos. En cada pasada, se encuentra el máximo del arreglo, y se lo lleva al extremo derecho. Una vez hecho esto, ese elemento deja de ser considerado, porque se encuentra ya en su posición definitiva. Esto conduce al siguiente invariante: a[i] < a[i+1] para i = k hasta n-1 a[j] < a [i] con j = 0 hasta k-1, todos desordenados En palabras: "Los elementos desde k hasta n-1 ya están ordenados y son mayores que los primeros k".

Condiciones iniciales y finales Condiciones iniciales: al principio no se puede decir nada, por lo que se hace k = n, lo que dice que implica: a[i] < a[i+1] para i = n hasta n-1 (no existe elemento) a[j] < a [n] con j = 0 hasta n-1, todos desordenados (a[n] no existe) ¿Más comprensible?: al principio poner el mayor del arreglo en el lugar n-1 y hacer k = n-1 b) Condición final: k = 1 (o mientras k >= 2) a[i] < a[i+1] para i = 1 hasta n-1 a[j] < a [1] con j = 0 hasta 0, todos desordenados

Ord. X selección: avanzar y restablecer invariante // Ordenar a[0], ..., a[n-1] por selección  k = n; // inicialmente los n primeros están desordenados while( k>1 )  { --k; //acercar k a la meta, se rompe el invariante     Llevar el max de a[0], ..., a[k] hacia a[k]; //esto restablece el invariante   } Donde Llevar el max de a[0], ..., a[k] hacia a[k] => i = 0; // a[i] es el max hasta el momento for( j=1; j<=k; ++j )     if( a[j]>a[i] )         i = j;// ahora intercambiamos a[i] con a[k] t = a[i]; a[i] = a[k]; a[k] = t;

Ejemplo 3: ordenación por burbuja Este método se basa en hacer pasadas de izquierda a derecha sobre los datos, intercambiando pares de elementos adyacentes que estén fuera de orden. Al final de cada pasada, en forma natural el máximo estará en la posición de más a la derecha (que es su posición final) y puede por lo tanto ser excluido en pasadas sucesivas. Esto conduce al siguiente invariante (idéntico al de ordenación por selección): a[i] < a[i+1] para i = k hasta n-1 a[j] < a [i] con j = 0 hasta k-1, todos desordenados

Ord. X burbuja: avanzar y restablecer invariante // Ordenar a[0], ..., a[n-1] por la burbuja (borrador) k = n; while( k>1 )  {     Hacer una pasada sobre a[0], ..., a[k-1];     Disminuir k;   } Donde Hacer una pasada sobre a[0], ..., a[k-1] => for( j=0; j<=k-2; ++j )    if( a[j]>a[j+1] ){ // Intercambiar a[j] con a[j+1]        t = a[j]; a[j] = a[j+1]; a[j+1] = t;    } y Disminuir k =>--k;

Ord. X burbuja: eficiencia Disminuir k => --k; Si el archivo está inicialmente ordenado, el programa igual hace n pasadas, cuando después de la primera ya podría haberse dado cuenta que el archivo ya estaba ordenado. Para aprovechar cualquier posible orden que pueda haber en el archivo, se puede hacer que el programa anote ("recuerde") el lugar en donde se produjo el último intercambio. Si la variable i se define de manera que el último intercambio en una pasada dada fue entre a[i-1] y a[i], entonces todos los elementos desde a[i] en adelante están ya ordenados (de lo contrario habría habido intercambios más hacia la derecha), y por lo tanto k se puede disminuir haciendo que sea igual a i: Hacer una pasada sobre a[0], ..., a[k-1] => i=0; for( j=0; j<=k-2; ++j )   if( a[j]>a[j+1] )   {    t = a[j];  a[j] = a[j+1]; a[j+1] = t;        i = j+1; //Recordar el lugar del último intercambio   } Disminuir k => k=i;

Ejemplo 4: Xn Cuando n es entero se puede programar una función más eficiente que la que usa java, basada en el cálculo de una serie. Incluso una solución simple sería más eficiente: public static double power(double x, int n) { // Algoritmo simple y = 1; for( j=n; j>0; --j )     y = y*x; return y; } Este algoritmo evidentemente toma tiempo O(n), y su invariante se puede escribir como         y * xj == xn

Aprovechando el invariante para la eficiencia Es posible encontrar un algoritmo sustancialmente más eficiente de la siguiente manera. Primero se desvinculan las dos ocurrencias de x en el invariante: y = 1; z = x; for( j=n; j>0; --j )     y = y*z; con invariante y * zj == xn Esto podría parecer ocioso, pero permite hacer una optimización al observar que está permitido modificar la variable z al inicio del ciclo siempre que se mantenga la validez del invariante. En particular, si j resulta ser par, podemos elevar z al cuadrado si al mismo tiempo dividimos j por 2. De esta manera, el invariante sigue igual, pero j disminuye mucho más rápido.

Algoritmo eficiente no recursivo Mejor todavía, si esto se puede hacer una vez, entonces se puede hacer muchas veces siempre que j siga siendo par: y = 1; z = x; for( j=n; j>0; --j ) // Invariante: y * zj == xn  {     while( j es par )      {        z = z*z;         j = j/2;       }     y = y*z;  } La detección que j es par se puede implementar como j es par => j&1 == 0   Este algoritmo demora tiempo O(log n), lo cual se debe a que j sólo se puede dividir log n veces por 2 antes de llegar a 1. Es cierto que j sólo se divide cuando es par, pero si es impar en una iteración del for, está garantizado que será par a la siguiente.

Ejemplo 4: Explicar un algoritmo difícil Se tiene un arreglo con n elementos (a[0] hasta a[n-1]) blanco y negros desordenados. Dejar los elementos intercalados. Si hay mas de una clase que de otra dejarlos todos al final. Ejemplo, si inicialmente se tiene dejarlos invariante ??????????? i j

Ejemplo 4: Explicar un algoritmo difícil (cont.) Inicialmente se hace i = 0; j = 1; Condicion final: j = n => continuación: while (j < n) Restablecer el invariante i j j i ?????????? i j Si a[j] mismo color que a[i] no se hace nada, si no, se intercambia con a[i+1]; j++

Otras Estructuras: Vector Una implementación de lista enlazada eficiente Puede contener objetos de cualquier clase Ultimas versiones de java apuntan a que todos sean de una sola (super)clase Vector v = new Vector(); //crea un vector vacio v.add(“Hola”); v.add(new Scanner()); ... //agregar elementos al final, v.add(5, “chao”); //agrega en el indice 5 //mostrar los elementos for(int i = 0; i < v.size(); i++) System.out.println(v.get(i).toString());

Generics: chequeo de tipos Usando Generics se puede hacer que se chequee el tipo de objeto Vector<Tipo> v = new Vector<Tipo>(); Solo se pueden poner objetos de la Clase Tipo (o derivados) v.add(“Hola”); //produciría error de compilación

Ejercicio en clases Se tiene un arreglo a[0] . . . a[n-1] con enteros y se quiere particionarlo de modo que queden todos los menores que cero a la izquierda y los iguales o mayores que cero a la derecha. En palabras: los elementos anteriores a a[i] son menores que cero, los elementos desde a[i] hasta a[j-1] son mayores que cero y los elementos desde a[j] en adelante son desconocidos <= 0 > 0 desconocidos i j