9 oct 2014

La clase String en Java

Características


En Java no existe un tipo primitivo para manejar cadenas de caracteres, se hace a través de la clase String.

Debido a su amplia utilización, la creación de objetos y asignación de valores puede hacerse como si se tratara de una clase normal, o como si fuera un tipo primitivo.

Ejs.:
String cad1= new String(Frase uno);
String cad2= Frase dos;

Las cadenas son constantes por lo que no pueden ser modificadas una vez creadas. Al asignarles un nuevo valor se les da una nueva dirección de memoria y el recolector se encarga de gestionar la antigua.

Para la concatenación se utiliza el operador +.


Principales métodos de la clase String

length()
Devuelve la longitud de la cadena.
String cad1= frase uno;
System.out.println(cad1.length());  //devuelve 9

charAt (int ind)
Devuelve el carácter de la posición ind.
char car;
car= cad.charAt(0);          // car contiene f

compareTo (String otroStr)
Compara léxicamente dos cadenas. Devuelve 0 si son iguales, un valor negativo si el primer string es menor que el segundo y uno positivo si es mayor que el segundo.
String cad2= frase dos;
num= cad1.compareTo(cad2);  // num vale 17

compareToIgnoreCase (String otroStr)
Igual que el método anterior, pero ignorando mayúsculas y minúsculas.

indexOf(String str).
Devuelve la posición de la cadena pasada como argumento sobre la primera cadena.
cad3 = cad1 + ' ' + cad2;
num= cad3.indexOf(cad2);   // num vale 10

substring(int inicio, int fin)
Devuelve una subcadena de la original, que empieza en la posición inicio y termina en fin.
cad3= cad2.substring(2,5);  //devuelve ase

replace (char viejo, char nuevo)
Reemplaza las ocurrencias del carácter viejo por el nuevo. Existen variantes para reemplazar cadenas, primeras ocurrencias o para utilizar expresiones regulares.
cad3= cad2.replace('s', 'z');  //devuelve fraze doz

toUpperCase()
Convierte en mayúsculas la cadena.
cad3 = cad2.toUpperCase();  //devuelve FRASE DOS

toLowerCase ()
Convierte en minúsculas la cadena.

split(String str)
Devuelve un vector de strings, obtenido al dividir la cadena en subcadenas definidas por el delimitador str.
cad3= "Ana#Gil#Laso#45#Lugo#68";
String cads[];
cads= cad3.split("#");
for (String cad:cads)
System.out.println(cad);
Se obtiene:
Ana
Gil
Laso
45
Lugo
68
trim()
Devuelve la cadena eliminando los espacios en blanco al principio y final de la cadena.
cad3= "   frase    ";
System.out.println(cad3.length());  //devuelve 12
cad3= cad3.trim();
System.out.println(cad3.length());  //devuelve 5

valueOf(tipo_básico tp)
Es un método estático de clase. Devuelve, como una cadena, el valor del argumento pasado como un tipo básico. Existe un método por cada tipo básico.
En muchas ocasiones no es necesario utilizarlo porque se produce una conversión de tipos implícita.
boolean varbool= true;
cad3= String.valueOf(varbool);
System.out.printf("El valor de varbool es: %s%n", varbool); //conversión implícita
System.out.printf("El valor de varbool es: %s%n",cad3);
Se obtiene:
El valor de varbool es: true
El valor de varbool es: true


8 oct 2014

La clase Scanner en Java

Permite realizar la entrada de datos desde dispositivos como la entrada estándar o los ficheros, proporcionando métodos para la lectura de cadenas y de los tipos básicos.

Ejs.:    Scanner scan1= new Scanner(System.in);
          Scanner scan2= new Scanner(File fich);

Va recogiendo fragmentos (tokens) de la entrada, siendo el separador por defecto el espacio en blanco. Mediante sus métodos se pueden analizar, recuperar y convertir los tokens que se van procesando.

Sus principales métodos son:
o   next() 
devuelve el siguiente elemento en la entrada.
o   hasNext() 
devuelve un valor boolean indicando si existe el siguiente elemento en la entrada.
o   hasNextByte(), hasNextInt(), hasNextFloat, …
devuelven un valor boolean indicando si el tipo del siguiente token coincide con el método, pero sin avanzar ningún token. Por ejemplo hasNextByte() devolvería el valor true si el siguiente token que se recuperaría con nextByte(), fuera un byte.
o   nextByte(), nextInt, nextFloat, …
devuelve el siguiente token como un valor del tipo indicado por el método. Por ejemplo nextByte() devolverá un byte.
o   useDelimiter(String delim)
cambia el delimitador de tokens por defecto, con el nuevo valor.


Ejemplo de uso de Scanner desde la entrada estándar

package esscanner;
import java.util.Scanner;
public class ESScanner {
    public static void main(String[] args) {
       boolean var_boolean;
       char var_char;
       int var_int;
       float var_float;
       String cadena;
       Scanner scan = new Scanner(System.in);
       System.out.printf(Escriba un boolean : ");
       var_boolean = scan.nextBoolean();
       scan.nextLine();
       System.out.printf(Escriba un char    : ");
       cadena = scan.nextLine();
       var_char = cadena.charAt(0);
       System.out.printf(Escriba un int: ");
       var_int = scan.nextInt();
       System.out.printf(Escriba un float: ");
       var_float = scan.nextFloat();
       scan.nextLine();
       System.out.printf(Escriba una frase: ");
       cadena = scan.nextLine();
       System.out.printf("var_boolean = %b%n", var_boolean);
       System.out.printf("var_char  = %c%n", var_char);
       System.out.printf("var_int     = %d%n", var_int);
       System.out.printf("var_float  = %14.9f%n", var_float);
       System.out.printf(Frase: %s%n", cadena);
    }
}


Ejemplo de uso de Scanner utilizando ficheros

package es_fich_scanner;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
/*
 * Lee un fichero de texto línea a línea
 * mostrándolo por pantalla
 * Lee un fichero de enteros delimitado por # y lo muestra
 */

public class ES_fich_Scanner {
    public static void main(String[] args) throws FileNotFoundException {
        File f = new File("fich_lineas.txt");
        Scanner scan = new Scanner(f);
        while (scan.hasNextLine()) {
            System.out.println(scan.nextLine());
        }
        File f2 = new File("fich_num.txt");
        scan = new Scanner(f2);
        scan.useDelimiter("#");
        while (scan.hasNextInt()) {
            System.out.println(scan.nextInt());
        }
    }
}


7 oct 2014

Entrada y Salida básica en Java

La E/S básica en Java se realiza mediante la clase System, a través de sus atributos estáticos err, out e in.

SALIDA
La salida se efectúa a través de System.err o System.out. Estos dos atributos de System son de tipo PrintStream y permiten utilizar, entre otros, los métodos:
o   print(), escribe el argumento. Está sobrecargado para los tipos primitivos.
§  System.out.print(Hola, mundo);
§  System.out.print(2050);
o   println(), escribe el argumento y salta de línea.
o   printf(), salida con formato de características análogas a las de C, con mejoras.
§  System.out.printf(Saludo: %s %d %n, Hola, mundo, 2050);

ENTRADA
La entrada puede efectuarse a través de System.in, de tipo Inputstream, de varias formas:
o   Mediante el método read(). Bastante limitado porque sólo permite leer bytes (valores numéricos entre 0 y 255) que devuelve como un entero.
o   a partir de un ejemplar de Console proporcionado por System. Sólo permite leer líneas completas, de tipo String, que después deben ser interpretadas si lo que se quiere obtener corresponde a otros tipos, por ejemplo numéricos.
o   a través de un ejemplar de Scanner, que se construye a partir de System.in,  en este caso permite acceder directamente a traductores de todos los tipos básicos, incluyendo líneas completas (String).


Ejemplo con read()

package entradaRead;

import java.io.IOException;

public class EntradaRead {

    public static void main(String[] args) throws IOException {
        char carac;
        System.out.print("Introduce una frase: ");
        while ((carac=(char) System.in.read()) != '\n')
            System.out.print(carac);
    }
   
}


Ejemplo con Console

package entradasalidaconsole;
import java.io.Console;

public class EntradaSalidaConsole {

    public static void main(String[] args) {
       String cadena = "una frase";
       Console con = System.console();
        if (null != con) {
            con.printf("%s%n", "Escribo desde Console");
            cadena= con.readLine("Escriba %s: ", cadena);
            con.printf("La cadena introducida es:%s%n", cadena);
            con.printf("Escribe otra frase: ");
            cadena= con.readLine();
            con.printf("La cadena introducida es:%s%n", cadena);
        } else {
            System.err.println("Perdón, no se puede usar la consola.");
        }
    }
}


Ejemplo con Scanner

package entradasalidascanner;
import java.util.Scanner;

public class Entradasalidascanner {

public static void main(String[] args) {
       String cadena = "una frase";
       Scanner sc = new Scanner(System.in);
       System.out.printf("Escriba %s: ", cadena);
       cadena= sc.nextLine();
       System.out.printf("La cadena introducida es:%s%n", cadena);
       System.out.print("Escribe otra frase: ");
       cadena= sc.nextLine();
       System.out.printf("La cadena introducida es:%s%n", cadena);
    }
    

}