23 enero 2012

Java para C# - 03 - Cadenas y teclado

El manejo de cadenas de texto en Java es muy parecido al de C#, aunque con un par de detalles diferentes, a los que merece la pena prestar atención. El teclado sí es bastante más incómodo. Vamos a ver primero un ejemplo en C# y su resultado, para luego convertirlo a Java:


using System;

public class CadenasTeclado
{

  public static void Main()
  {

    string ejemplo = "Hola, que tal estas";
   
    string ejemplo2 = "Hola";
    string ejemplo3;
    ejemplo3 = " y hola";
    string ejemplo4 = ejemplo2+ejemplo3;
   
    if (ejemplo2 == "Hola")
      Console.WriteLine("El texto 2 es Hola");
       
    Console.WriteLine("El texto es: {0}",
      ejemplo);
     
    Console.WriteLine("La primera letra es: {0}",
      ejemplo[0]);
   
    Console.WriteLine("Las tres primeras letras son: {0}",
      ejemplo.Substring(0,3));

    Console.WriteLine("La longitud del texto es: {0}",
      ejemplo.Length);
   
    Console.WriteLine("La posicion de \"que\" es: {0}",
      ejemplo.IndexOf("que"));
   
    Console.WriteLine("La ultima A esta en la posicion: {0}",
      ejemplo.LastIndexOf("a"));
     
    Console.WriteLine("En mayúsculas: {0}",
      ejemplo.ToUpper());
     
    Console.WriteLine("En minúsculas: {0}",
      ejemplo.ToLower());
     
    Console.WriteLine("Si insertamos \", tio\": {0}",
      ejemplo.Insert(4,", tio"));
   
    Console.WriteLine("Si borramos las 6 primeras letras: {0}",
      ejemplo.Remove(0, 6));
   
    Console.WriteLine("Si cambiamos ESTAS por ESTAMOS: {0}",
      ejemplo.Replace("estas", "estamos"));
     
    // Y ahora vamos a leer desde teclado
   
    Console.Write("Dime tu nombre: ");
    string nombre = Console.ReadLine();
    Console.WriteLine("Hola {0}", nombre);
   
    Console.Write("Vamos a sumar dos números... Primero? ");
    int n1 = Convert.ToInt32( Console.ReadLine() );
    Console.Write("Segundo? ");
    int n2 = Convert.ToInt32( Console.ReadLine() );
    Console.WriteLine("Suma: {0}", n1+n2);
  }
}



Que mostraría algo como


El texto 2 es Hola
El texto es: Hola, que tal estas
La primera letra es: H
Las tres primeras letras son: Hol
La longitud del texto es: 19
La posicion de "que" es: 6
La ultima A esta en la posicion: 17
En mayúsculas: HOLA, QUE TAL ESTAS
En minúsculas: hola, que tal estas
Si insertamos ", tio": Hola, tio, que tal estas
Si borramos las 6 primeras letras: que tal estas
Si cambiamos ESTAS por ESTAMOS: Hola, que tal estamos
Dime tu nombre: yo
Hola yo
Vamos a sumar dos números... Primero? 1
Segundo? 3
Suma: 4


Al pasarlo a Java tenemos que tener en cuenta que:
  • Como ya hemos comentado, el tipo "cadena de texto" no se llama "string", sino "String"
  • Como también hemos visto, no se utiliza "{0}" para posicionar los parámetros, pero se pueden unir varios textos en uno usando "+".
  • Para comprobar el valor de una cadena no se debe usar "==", porque estaríamos comparando realmente si están en la misma posición de memoria. En vez de eso, debemos usar "equals".
  • Para extraer un carácter de la cadena no se emplean corchetes, sino "charAt".
  • La longitud no se halla con ".Length" sino con ".length()"
  • "Substring", "IndexOf", "LastIndexOf" se usan igual, pero su nombre debe tener la primera letra en minúsculas.
  • En lugar de "ToLower" se usa "toLowerCase", y lo mismo ocurre para "ToUpper".
  • No existen "Insert" ni "Remove", que tendremos que imitar con "substring".
  • La lectura de teclado es mucho más incómoda que en C#: puede que no exista un teclado conectado al sistema, por lo que toda la lectura debe ir dentro de un bloque try-catch. Por si fuera poco, no podemos leer directamente desde la entrada del sistema (System.in), sino a un "flujo de datos de entrada" (InputStreamReader), que a su vez es procesado por un "lector con buffer" (BufferedReader). Además, al principio de nuestro programa deberá aparecer la línea "import java.io.*;"
  • Para convertir de cadena a número entero, podemos usar "Integer.parseInt( texto )".
  • Si queremos mostrar el resultado de una suma, y estamos concatenando cadenas, puede ser preferible escribir "System.out.println("Suma: "+ (n1+n2));", con la suma entre paréntesis, en vez de "System.out.println("Suma: "+ n1+n2);" para dejar claro que n1 y n2 no se deben concatenar como si ambos fueran texto, sino que primero se deben sumar como números y después ya se puede añadir a la cadena de texto.
Con todos estos cambios, el fuente podría quedar así...

    import java.io.*;

    class CadenasTeclado
    {
       
        public static void main( String[] args )
        {
            String ejemplo = "Hola, que tal estas";

            String ejemplo2 = "Hola";
            String ejemplo3;
            ejemplo3 = " y hola";
            String ejemplo4 = ejemplo2+ejemplo3;
           
            if (ejemplo2.equals("Hola") )
              System.out.println("El texto 2 es Hola");
               
            System.out.println("El texto es: "+ejemplo);
             
            System.out.println("La primera letra es: "+
              ejemplo.charAt(0));
           
            System.out.println("Las tres primeras letras son: "+
              ejemplo.substring(0,3));

            System.out.println("La longitud del texto es: "+
              ejemplo.length());
           
            System.out.println("La posicion de \"que\" es: "+
              ejemplo.indexOf("que"));
           
            System.out.println("La ultima A esta en la posicion: "+
              ejemplo.lastIndexOf("a"));
             
            System.out.println("En mayúsculas: "+
              ejemplo.toUpperCase());
             
            System.out.println("En minúsculas: "+
              ejemplo.toLowerCase());
             
            System.out.println("Si insertamos \", tio\": "+
              ejemplo.substring(0,4)+
              ", tio"+
              ejemplo.substring(4));
           
            System.out.println("Si borramos las 6 primeras letras: "+
              ejemplo.substring(6));
           
            System.out.println("Si cambiamos ESTAS por ESTAMOS: "+
              ejemplo.replace("estas", "estamos"));
             
            // Y ahora vamos a leer desde teclado
           
            System.out.print("Dime tu nombre: ");
            String nombre = "";
            try {
              BufferedReader entrada =
                new BufferedReader(new InputStreamReader(System.in));  
              nombre = entrada.readLine();
            }
            catch (IOException e) {}
            System.out.println("Hola "+ nombre);
           
            System.out.print("Vamos a sumar dos números... Primero? ");
            String n1string = "";
            int n1=0;
            try {
              BufferedReader entrada =
                new BufferedReader(new InputStreamReader(System.in));  
              n1string = entrada.readLine();
              n1 = Integer.parseInt(n1string);
            }
            catch (IOException e) {}

            System.out.print("Segundo? ");
            String n2string = "";
            int n2=0;
            try {
              BufferedReader entrada =
                new BufferedReader(new InputStreamReader(System.in));  
              n2string = entrada.readLine();
              n2 = Integer.parseInt(n2string);
            }
            catch (IOException e) {}        
           
            System.out.println("Suma: "+ (n1+n2));
           
        }
    }



    Mañana hablaremos de otros tipos de datos simples, de arrays y de números al azar.