1. Cadenas de Caracteres

En la etapa de diseño, al especificar un pseudocódigo de un algoritmo utilizamos el tipo TEXTO para representar una cadena de caracteres. Una variable de este tipo se declara de la siguiente forma:

  TEXTO mensaje
  mensaje ← ”Ingrese la cantidad de alumnos”
  ESCRIBIR(mensaje)

En este ejemplo, la variable mensaje es de tipo TEXTO. La variable asume un valor particular en la segunda línea a partir de la asignación. Y ese valor, es utilizado para mostrar por pantalla un mensaje al usuario.

  • Cuando queremos representar el literal de un TEXTO, o la cadena de texto en sí, lo escribimos entre doble comillas. Hemos utilizado cadenas de texto con distintos propósitos. Por ejemplo:
  • Cuando queremos mostrar un mensaje en pantalla para indicarle al usuario que ingrese un valor particular.
ESCRIBIR(”Ingrese la cantidad de alumnos”)
  • Cuando queremos producir mensajes m´as precisos. Por ejemplo en el siguiente ejemplo el módulo ejemplo recibe por pantalla un entero i, y muestra los n´umeros naturales desde el uno hasta \(i\).

El mensaje por pantalla produce un mensaje indicando: Número: 1, Número: 2, etc.

MóDULO ejemplo(ENTERO i) RETORNA ;
  (*....*)
  ENTERO x, j
  x ←   1
  PARA j ← 0 HASTA i PASO 1 HACER
      ESCRIBIR("Número: ",x)
      x ← x + 1
  FIN PARA
FIN MóDULO ejRepetirPara

Las cadenas de texto se representan en Java por el tipo de dato String.

2. Cadenas en JAVA

En Java no existe un tipo de dato primitivo que sirva para la manipulación de caracteres. En su lugar se utiliza la clase String. Esto significa que en Java las cadenas de caracteres son objetos que se manipulan como tales, aunque existen ciertas operaciones que nos permiten acceder a ciertas funcionalidades. Un valor de tipo String es una secuencia de caracteres tratado como un ítem único. Cuando se dice en Java que una variable es un String lo que se quiere decir en realidad es que la variable es una referencia a un String.

2.1. Declaración en Java

Un string se puede declarar de la siguiente forma:

String saludo ;
saludo = "Hola ! " ;

o:

String saludo = "Hola ! " ;

o un String puede crearse como se crea cualquier otro objeto de cualquier clase, mediante el operador new:

String saludo = new String("Hola ! ") ;

Los literales de cadena de caracteres se indican entre comillas dobles, a diferencia de los caracteres que utilizan comillas simples.

2.2. Salida por pantalla

Para mostrar el contenido de un String utilizamos la siguiente instruccion:

System.out.println(saludo);

2.3. Concatenación de cadenas

Java define el operador + (suma) con un significado especial cuando los operandos son de tipo String. En este caso el operador suma significa concatenación. En el siguiente ejemplo el resultado de la concatenación es un nuevo String compuesto por las dos cadenas, una tras otra. Por ejemplo:

String x = "Problemas " + "y Algoritmos" ;

da como resultado el String “Problemas y Algoritmos”.

Veamos otro ejemplo:

String saludo = "Hola " ;
Sting sentencia ;
sentencia = saludo + " operador" ;
System.out.println(sentencia);

También es posible concatenar a un String datos primitivos, tanto numéricos como booleanos y char. Por ejemplo, se puede usar:

int i = 5 ;
String x = " El valor de i es "+ i ;

Cuando se usa el operador + y una de las variables de la expresi´on es un String, Java transforma la otra variable (si es de tipo primitivo) en un String y las concatena. Otro ejemplo:

String solucion;
solucion = "La temperatura es " + 72;
System.out.println(solucion);

2.4. Clases, Objetos y Médodos

Como dijimos previamente String es una clase. Una clase es un tipo usado para producir objetos. Cada declaración de un String en realidad implica la creaci´on de un objeto de la clase String. Un objeto es una entidad que almacena datos. Podemos realizar acciones con los objetos invocando las acciones que definen su comportamiento. El comportamiento de un objeto se define a partir de métodos.

Un objeto de la clase String almacena datos que consisten en una secuencia de caracteres. Las operaciones sobre objetos de la clase String se ejecutan invocando los metodos correspondientes.

Por ejemplo el método length() retorna el n´umero de caracteres de un objeto String particular, es decir retorna un entero.

String cartel;
int longitudCartel;
cartel = "Bienvenido a Java";
longitudCartel = cartel.length();
Sytem.out.println(longitudCartel);

La salida por pantalla del fragmento de c´odigo anterior es: 17.

3. Operaciones con cadenas

A continuaci´on describiremos en forma de tabla diferentes operaciones que pueden realizarse con el tipo TEXTO o cadenas de caracteres. Mostraremos los m´etodos para la clase String en JAVA. La tabla presenta cuatro columnas: la primera nos muestra como escribir la primitiva en pseudocódigo, la segunda nos permite ver algunos componentes de la signatura del m´etodo (nombre y parámetros) en JAVA, la tercera columna describe brevemente la primitiva (´o m´etodo en JAVA) y la cuarta columna muestra un ejemplo.

4. Posiciones en una cadena

Las variables de tipo TEXTO contienen una cadena de caracteres. Podr´ıamos decir que una variable de tipo TEXTO tiene componentes dentro de s´ı. Estos componentes se encuentran en distintas posiciones comenzando desde 0. Ejemplos: En ”Java es divertido”la ’J’ esta en la posicion 0 Otros ejemplos”:

String cartel = "Bienvenido a Java";
System.out.println(cartel.charAt(4));
System.out.println( cartel.substring(3,9) ) ;

Cuya salida por pantalla es:

v
nvenid

5. Comparación de cadenas

El operador == no es apropiado para determinar si dos cadenas de caracteres (dos strings) tienen el mismo valor.

6. Comportamiento de Cadenas

6.1 Longitud

Retorna la longitud de la cadena de caracteres.

Pseudocódigo

TEXTO saludo
saludo ← "Hola!" 
ESCRIBIR(longitud(saludo)) 
(* salida por pantalla 5)

Java

String saludo = "Hola!" ;
System.out.println(saludo.length()); 
// muestra por pantalla 5

6.2 Igual

Retorna true si el contenido de dos cadenas son iguales, sino retorna false.

Pseudocódigo

TEXTO saludo
LEER(saludo);
SI igual(saludo,"Hola") ENTONCES
  ESCRIBIR("Saludo Informanl")
FIN SI

Java

Scanner sc = new Scanner(System.in);
// entrada de una cadena
String saludo = sc.nextLine();
if (saludo.equals("Hola"))
  System.out.println("saludo informal");

6.3. equalsIgnoreCase

Retorna true si el contenido de cadena1 y de cadena2 son iguales, considerando una letra en mayúscula y minúscula como iguales, sino retorna false.

Pseudocódigo

TEXTO s1
s1 ← "mary" 
ESCRIBIR(igualIgnoreMayúsculas(s1,"Mary"))
(* retorna VERDADERO *)

Java

String s1 = "mary";
System.out.println(s1.equalsIgnoreCase("Mary"));
// retorna TRUE

6.4. toLowerCase

Retorna un String con los mismos caracteres pero convertidos en minúscula.

Pseudocódigo

TEXTO s1
s1 ← "Hola Mary" 
ESCRIBIR(aMinuscula(s1))
(* retorna "hola mary" *)

Java

String s1="Hola Mary" ;
System.out.println(s1.toLowerCase());
// muestra por pantalla "hola mary"

6.5. toUpperCase

Retorna un String con los mismos caracteres pero convertidos en mayúscula.

Pseudocódigo

TEXTO s1
s1 ← "Hola Mary" 
ESCRIBIR(aMayuscula(s1))
(* retorna "HOLA MARY" *)

Java

String s1 = "Hola Mary";
System.out.println(s1.toUpperCase();
// retorna "HOLA MARY"

6.6. trim

Retorna un String con los mismos caracteres que cadena, pero remueve los espacios por delante y detrás

Pseudocódigo

TEXTO pausa
pausa ← " Hmmm "
System.out.println(pausa.trim())
(* muestra "Hmmm" sin espacios *)

Java

String pausa = " Hmmm ";
System.out.println(pausa.trim());
// muestra "Hmmm" sin espacios

6.7. charAt

Retorna el carácter que en cadena se encuentra en la posición pos. La posición se cuenta 0, 1, 2, etc.

Pseudocódigo

TEXTO saludo
saludo ← "Hola !"
ESCRIBIR(caracterEnPosicion(saludo,0))
(* muestra 'H'*)
ESCRIBIR(caracterEnPosicion(saludo,3))
(* muestra 'a'*)

Java

String saludo = "Hola !" ;
System.out.println(saludo.charAt(0)); 
// muestra 'H' 
System.out.println(saludo.charAt(3)); 
// muestar 'a' 

6.8. Subcadena

Retorna la subcadena de cadena desde la posición indicada hasta el final.

Pseudocódigo

TEXTO prueba
prueba ← "AbcdefG" ;
ESCRIBIR(subcadena(prueba,2)) 
(* muestra " cdefG")

Java

String prueba = "AbcdefG" ;
System.out.println(prueba.substring(2)); 
// muestra por pantalla "cdefG"

6.9 Subcadena

Retorna la subcadena de cadena desde la posición inicial hasta otra posición final sin incluirla.

Pseudocódigo

TEXTO prueba
prueba ← "AbcdefG" ;
ESCRIBIR(subcadena(prueba,2,5)) 
(* muestra "cde")

Java

String prueba = "AbcdefG" ;
System.out.println(prueba.substring(2,5)); 
// muestra por pantalla "cde"

6.10. indexOf

Retorna la posición de la primer ocurrencia de cadena2 dentro de cadena1. Las posiciones se cuentan 0,1,2, etc. Retorna -1 si cadena2 no existe dentro de cadena1.

Pseudocódigo

TEXTO saludo
saludo ← "Hola Mary"
ESCRIBIR(indiceDe(saludo,"Mary"))
(* retorna 5 *)
ESCRIBIR(indiceDe(saludo,"Sally");
(* retorna -1 *)

Java

String saludo = "Hola Mary";
System.out.println(saludo.indexOf("Mary"));
// retorna 5
saludo.indexOf("Sally"));
// retorna -1

6.11. indexOf

Retorna la posición de la primer ocurrencia de cadena2 dentro de cadena1, a partir de la posición ini. Las posiciones se cuentan 0,1,2, etc. Retorna -1 si cadena2 no existe dentro de cadena1.

Pseudocódigo

TEXTO saludo
saludo ← "Hola Mary";
ESCRIBIR(indiceDe(saludo,"Mary",1))
(* muestra 5 *)
ESCRIBIR(indiceDe(saludo,"Mary",8)) 
(* muestra -1 *)

Java

String saludo = "Hola Mary";
System.out.println(saludo.indexOf("Mary",1));
// muestra 5
System.out.println(saludo.indexOf("Mary",8)); 
// muestra -1

6.12. lastIndexOf

Retorna la posición de la última ocurrencia de cadena2 dentro de cadena1. Las posiciones se cuentan 0,1,2,etc. Retorna -1 si cadena2 no existe dentro de cadena1.

Pseudocódigo

TEXTO s1
s1 ← "Mary, Mary, Mary no"
ESCRIBIR(ultimoIndiceDe(s1,"Mary"))
(*  retorna 12 *)

Java

String s1 = "Mary, Mary, Mary no"
System.out.println(s1.lastIndexOf("Mary"));
// retorna 12

6.13. compareTo

Compara cadena1 con cadena2 de acuerdo a su orden lexicográfico (que es equivalente al alfabético si las letras están todas en minúsculas o mayúsculas). Si el cadena1 es menor que cadena2 devuelve un valor negativo, si son iguales devuelve 0 y si cadena1 es mayor devuelve un número positivo.

Pseudocódigo

TEXTO entrada
entrada ← "aventura"
ESCRIBIR(compararA(entrada,"zoo"))
(* retorna un valor negativo *)
ESCRIBIR(compararA(entrada,"abajo"))
(* retorna un valor positivo *)

Java

String entrada = "aventura";
System.out.println(entrada.compareTo("zoo"));
// retorna un valor negativo 
System.out.println(entrada.compareTo("abajo"));
// retorna un valor positivo 

7. Ejemplos

7.1. Recorrido de una cadena

Pseudocódigo

ALGORITMO recorrido() RETORNA ∅
(* solicita al usuario una cadena y obtiene 
   cada uno de sus caracteres*)
  TEXTO cadena
  ENTERO i, lon
  ESCRIBIR("Ingrese una cadena")
  LEER(cadena)
  lon <- longitud(cadena) - 1
  PARA i= 0 HASTA lon  PASO 1 HACER
      ESCRIBIR(caracterEnPosicion(cadena, i))
  FIN PARA
FIN ALGORITMO

Java

import java.util.Scanner;

public class JavaApplication35 {
public static void main(String[] args) {
  // TODO code application logic here
  Scanner s = new Scanner(System.in);
  String cadena;
  int i, lon;
  System.out.println("Ingrese una cadena");
  cadena = s.nextLine();
  lon = cadena.length()
  for (i = 0; i < lon ; i++) {
      System.out.println(cadena.charAt(i));
  }
  }
}

7.2. Recorrido de una cadena

Pseudocódigo

ALGORITMO recorrido() RETORNA ∅
(* solicita al usuario una cadena y 
   como desea el usuario descomponer 
   la cadena*)
  TEXTO cadena, orden
  ENTERO i, lon
  ESCRIBIR("Ingrese una cadena")
  LEER(cadena)
  ESCRIBIR("Indique en que orden desea 
      descomponer la palabra (normal o inverso):")
  LEER(orden)
  lon <- longitud(cadena) - 1
  SI igual(orden,"normal") ENTONCES
    PARA i= 0 HASTA lon  PASO 1 HACER
      ESCRIBIR(caracterEnPosicion(cadena, i))
    FIN PARA
  SINO
     SI igual(orden,"inverso") ENTONCES
        PARA i= lon HASTA 0  PASO -1 HACER
          ESCRIBIR(caracterEnPosicion(cadena, i))
        FIN PARA
     FIN SI
  FIN SI
FIN ALGORITMO

Java

import java.util.Scanner;

public class JavaApplication35 {
public static void main(String[] args) {
  // solicita al usuario una cadena y 
  //  como desea el usuario descomponer 
  //  la cadena
  Scanner s = new Scanner(System.in);
  String cadena, orden;
  int i, lon;
  System.out.println("Ingrese una cadena");
  cadena = s.nextLine();
  System.out.println("Indique en que orden desea 
      descomponer la palabra (normal o inverso):");
  orden = s.nextLine();
  lon = cadena.length() - 1;
  if (orden.equals("normal")) {
    for (i = 0; i <= lon ; i++) {
        System.out.println(cadena.charAt(i));
    }
  } else if (orden.equals("inverso")) {
    for (i = lon ; i >= 0; i--) {
        System.out.println(cadena.charAt(i));
    }
  }
  }
}

7.3. Recorrido Parcial

Problema: Dada una cadena obtener la posición de un caracter en la cadena.

Pseudocódigo


MÓDULO obtenerPosiciónEnCadena(TEXTO cadena, CARACTER carac ) RETORNA ENTERO
  (* devolver la primera posición de un caracter en una cadena, si no lo encuentra retorna -1
   cadena: la cadena a recorrer
   carac: el caracter del cual se desea obtener la posicion en la cadena*)
   ENTERO iter, longitud, pos
   LOGICO encontrado
   pos ← -1
   iter ← 0          
   encontrado ← FALSO
   longitud ← longitud(cadena)
   MIENTRAS ((iter < longitud) AND ! encontrado)  HACER
       SI ( caracterEnPosicion(cadena, iter) = carac )  ENTONCES
            pos ← iter                        
            Encontrado ← VERDADERO  
       SINO 
            iter ← iter+1
       FIN SI   
   FIN MIENTRAS
   RETORNA pos 
FIN MÓDULO principal

ALGORITMO principal() RETORNA ∅
   (* obtener la primera posición de un caracter en una cadena*)
   TEXTO cadena
   CARACTER caracABuscar
   ENTERO posicion
   ESCRIBIR(“Ingrese la cadena de caracteres”)
   LEER(cadena) 
   ESCRIBIR(“Ingrese un caracter del cual se desea obtener su posición en la cadena”)
   LEER(caracABuscar)
   posicion ← obtenerPosiciónEnCadena(cadena, caracABuscar)
   ESCRIBIR(“El caracter ”+ caracABuscar +” esta en la posición: “+ posicion)
FIN ALGORITMO principal

Java

import java.util.Scanner;

public class JavaApplication40 {
public static int obtenerPosicion(String cadena, char e) {
 /** obtiene la posición de la primera  
* ocurrencia de un caracter en una cadena
* cadena: cadena a evaluar
* e: caracter del cual se desea 
* obtener su primera posición
*/
  int pos = -1;
  int longitud, i;
  boolean encontrado = false;
  i = 0;
  longitud = cadena.length();
  while ((i < longitud) & !encontrado) {
    if (cadena.charAt(i) == e) {
       pos = i;
       encontrado = true;
    } else {
       i++;
    }
    }
  return pos;
}

public static void main(String[] args) {
  int posicion;
  String cadena;
  char carac;
  Scanner s = new Scanner(System.in);

  System.out.println("Por favor ingrese una cadena");
  cadena = s.next();
  System.out.println("Por favor ingrese una caracter");
  carac = s.next().charAt(0);

  posicion = obtenerPosicion(cadena, carac);
  System.out.println("El caracter esta en la posicion: " + posicion);
}

}

7.4. Recorrido Total

Problema: ada una cadena obtener la cantidad de ocurrencias de un caracter en la cadena.

Pseudocódigo

MÓDULO cantOcurrencias(TEXTO cadena, CARACTER e) RETORNA ENTERO
  (* obtiene la posición de la ocurrencia de un caracter
  es un ejemplo de un recorrido TOTAL o 
  exhaustivo
  cadena: cadena a evaluar
  e: caracter del cual se desea obtener la 
  cantidad de ocurrencias *)
  ENTERO cant, longitud, i
  cant ← 0
  longitud ← longitud(cadena) -1
  PARA i ← 0 HASTA longitud  PASO 1 HACER
     SI (caracterEnPosicion(cadena, i) = e ) 
     ENTONCES
        cant ←cant + 1
     FIN SI 
  FIN PARA
  RETORNAR cant
FIN MÓDULO cantOcurrencias

ALGORITMO principal() RETORNA ∅
   (* obtener la primera posición de un caracter en una cadena*)
   TEXTO cadena
   CARACTER caracABuscar
   ENTERO posicion
   ESCRIBIR(“Ingrese la cadena de caracteres”)
   LEER(cadena) 
   ESCRIBIR(“Ingrese un caracter del cual 
  se desea obtener su posición en la cadena”)
   LEER(caracABuscar)
   posicion ← obtenerPosiciónEnCadena(cadena, caracABuscar)
   ESCRIBIR(“El caracter ”+ caracABuscar +” esta en la posición: “+ posicion)
FIN ALGORITMO principal

Java

import java.util.Scanner;

public class JavaApplication40 {

public static int cantOcurrencias(String cadena, char e) {
 // obtiene la posicion de la ocurrencia de un caracter
 // es un ejemplo de un recorrido TOTAL o exhaustivo
 // cadena: cadena a evaluar
 // e: caracter del cual se desea obtener la cantidad de ocurrencias
   int cant = 0;
   int longitud, i;
   longitud = cadena.length();
   for (i = 0; i < longitud; i++) {
     if (cadena.charAt(i) == e) {
        cant++;
     }
   }
   return cant;
}

public static void main(String[] args) {
  int posicion;
  String cadena;
  char carac;
  Scanner s = new Scanner(System.in);

  System.out.println("Por favor ingrese una cadena");
  cadena = s.next();
  System.out.println("Por favor ingrese una caracter");
  carac = s.next().charAt(0);
  System.out.println("La cantidad de ocurrencias es: " +                   
         cantOcurrencias(cadena, carac));
}

}

7.5. Orden Lexicográfico

Problema: Obtener el menor nombre en orden lexicográfico, de un número predeterminado de nombres ingresados por el usuario. 

Busqueda Menor Lexicográficamente Busqueda Menor Lexicográficamente

7.6. Ejemplo con Módulos

Problema: Solicitar al usuario una cadena de caracteres. Luego obtener:
1. Su Longitud
2. El caracter en la posición 5.
3. Obtener la inversa de la cadena
4. Contar la cantidad de ocurrencias de un caracter en la cadena
5. Verificar la existencia de un caracter
6. Contar la cantidad de vocales en una cadena

El siguiente .java muestra un ejemplo utilizando modularización.

8. Videos de Clases