16 dic 2014

Algoritmos clásicos de ordenación en Java

 

Ordenación de vectores mediante algoritmos

Ordenación por intercambio

Ordenación por selección

Ordenación por el método de la burbuja




Ordenación de vectores mediante algoritmos

Ordenación por intercambio

Hace sucesivas pasadas, comprobando valores consecutivos. Si uno no es menor que el otro, se intercambian, con lo que se va ordenando parcialmente.  Se termina cuando en una pasada no se realiza ningún intercambio.

Inter= true;
while  (inter == true) { // mientras haya habido intercambio
            inter= false;
            for (i=0; i <= n-2; i++) {
                        if (t[i] > t[i+1]){
                                   aux= t[i];
                                   t[i] = t[i+1];
                                    t[i+1] = aux;
                                   inter= true;
                                   }
                        }
            }

 

Ordenación por selección

Se busca el mínimo, se intercambia con el primer elemento. Se repite el proceso con el resto de valores desordenados,  ubicando el segundo valor mínimo como el segundo de los ordenados, hasta que no existan valore desordenados.

for (k=0; k <= n-2; k++) { // buscamos el mínimo entre k y n
            indMin = k; //se toma el primero
            for (i=k           +1; i<=n-1; i++) {
                        if (t[i] < t[indMin]){
                                   indMin= i;        //nuevo mínimo
                                   }
            }
            aux = t[indMin];
            t[indMin] = t[k];
            t[k]= aux;
}

 

Ordenación por el método de la burbuja

Se trata de una ordenación por intercambio mejorada, ya que en cada iteración nos queda ordenado el último elemento, con lo que ya no es necesario llegar a ese elemento sino hasta el anterior.


for (i=0; i <= n-2; i++) {
            for (j=0; j <=  n-2 –i ; j++) {
                        if (t[j] > t[j+1]){
                                   aux = t[j];
                                   t[j] = t[j+1];
                                   t[j+1]= aux;
                                   }
            }
}

 

14 nov 2014

La clase PrintWriter de Java

Características.

Clase que nos permite escribir con formato texto tanto en la salida estándar, como en ficheros, en cadenas, o en streams.

Hay que especificar, a través de los argumentos, dónde se va a producir la salida.

EJ. 1:   PrintWriter pw1= new PrintWriter(System.out);
EJ. 2:   PrintWriter pw2= new PrintWriter(new File("fichero.txt"));

A partir de la versión 5, incluso se permite:

Ej. 3:    PrintWriter pw2= new PrintWriter("fichero.txt");

Implementa todos los métodos de la clase PrintStream. A diferencia de esta clase, sus métodos de escritura no se vacían automáticamente al escribir una nueva línea.

Principales métodos.

o   print(), escribe el argumento. Está sobrecargado para los tipos primitivos.
pw.print(Hola, mundo);
pw.print(2050);

o   println(), escribe el argumento y salta de línea.

o   printf(), salida con formato, similar a C.
pw.printf(Saludo: %s %d %n, Hola, mundo, 2050);

o   flush(),  vacía el stream.

o   close(), cierra vaciando previamente el stream.

o   write(), escribe el argumento.
pw.write(Hola, mundo);


Ejemplo:

public static void main(String[] args){
    …
       FileWriter f = new FileWriter(“salida.txt”);
  PrintStream ps = new PrintStream(f);
  for (int[] fila : matriz) {
      String st = "";
      for (int value : fila) {
            st += value + delimiter;
            }
         ps.printf("%s%n", st);
     }
  ps.close();

}

13 nov 2014

Estructuras de control en Java - El bucle for – each


Dentro de las estructuras de control repetitivas, Java cuenta con los tradicionales while(), do-while() y for () con estructuras idénticas a las utilizadas en C y en C++, con la salvedad de la condición de iteración que tiene que ser un valor lógico, no valiendo un valor numérico.

Java además, a partir de la versión 5, incorpora el bucle, conocido como for each.
  • Se utiliza de manera especial para controlar arrays o en general colecciones. 
  • Tiene la ventaja de no tener que utilizar una variable para controlarlo. 
  • Su funcionamiento se basa en iterar para cada uno de los elementos de la colección, sin necesidad de conocer el número de elementos de los que consta.


El formato de este bucle es: 

for( tipo var_elto: var_array){
//instrucciones
}

Su funcionamiento, consiste en ir tomando cada elemento del array var_array, que serán del tipo tipo_var y lo copia en var_elto para su procesamiento.


Ejemplo, for each frente a for tradicional:

public static void main(String[] args){
    int[] lista = {1, 2, 3, 4};
     // recorrido del array
    for(int n : lista)
        System.out.println(n);
     // recorrido del array con el for tradicional
 for(int i=0; i< lista.length; i++ )
        System.out.println(lista[i]);
}


Ejemplo, con una colección:

public static void main(String[] args){
    …
  ArrayList<String> aList = new ArrayList<String>();
    aList.add(“Madrid”);
    aList.add(“Palencia”);
    aList.add(“Guadalajara”);
  // recorrido de una colección
    for(String s : aList)
        System.out.println(s);
}


Ejemplo, procesando una matriz por filas y columnas: 

public static void main(String[] args){
    int[][] matriz;
  for (int[] fila : matrix) {
         for (int elto : fila) {
                System.out.printf("%8d", elto);
            }
      System.out.printf(“%n");
     }
}


Equivalente con el for tradicional: 

public static void main(String[] args){
    int[][] matriz;
  for (int i=0; i < matriz.length; i++) {
         for (int j=0; j < matriz[0].length; j++) {
                System.out.printf("%8d", matriz[i][j]);
            }
      System.out.printf(“%n");
     }

}