ARD-SYN 06 – Sintaxis (VI). La clase String

Facebooktwittergoogle_pluslinkedinmailFacebooktwittergoogle_pluslinkedinmail

En el artículo anterior mencioné de pasada, al final, la clase String que implementa Arduino para manejo de cadenas. Dadas las muchas prestaciones que esta clase nos ofrece, merece dedicarle un post completo, y a ello vamos.

DECLARANDO CADENAS CON String

Declarar cadenas usando la clase String es, en realidad, crear objetos de dicha clase. El constructor de la clase permite crear cadenas de varias maneras diferentes, según los argumentos recibidos.

A continuación vemos unos ejemplos en un sketch:

El código está comentado, para que veas lo que hace en cada caso. El resultado en la consola es el siguiente:

Constructores de la clase String:

Esto es un objeto String.
a
Esto es otro objeto String.
Esto es otro objeto String. Y aquí hay más.
456
ff
11111111
100
4618.95

ATENCIÓN. Observa la incidencia que hay con las letras acentuadas, en la siguiente línea:

Esto es otro objeto String. Y aquí hay más.

Arduino internamente maneja UTF-8, pero la consola serie, y determinados dispositivos de visualización (cómo, por ejemplo, los displays LCD) no pueden y sólo manejan el código ASCII, de modo que las letras acentuadas y otros caracteres no estándar son un problema. Trata de evitarlos en tus sketches.

En resumen, cómo ves, el constructor de String acepta, prácticamente, cualquier tipo de argumento que le des, y lo convierte en cadena.

IDENTIFICAR, REEMPLAZAR Y LOCALIZAR CARACTERES

En un objeto String podemos identificar un carácter determinado, y sustituirlo por otro. Para identificar un carácter usamos el método charAt(posicion). Recibe, cómo argumento, la posición dentro de la cadena, del carácter que queremos identificar. Ten en cuenta que los carácteres se empiezan a numerar desde 0.

Si queremos sustituir un carácter en una posición por otro usaremos el método setCharAt(posicion, nuevo_caracter). Al igual que antes, la posición del carácter a sustituir en la cadena empieza a contarse desde 0. Si la posición supera la longitud de la cadena menos 1 (es decir, la última posición existente) el método no causará ningún efecto.

Podemos buscar la aparición de un carácter, o de una secuencia de caracteres en una cadena, usando el método indexOf(caracter). Este método empieza a buscar desde el primcipio de la cadena, es decir, desde la posición 0. Si queremos que empiece desde otra posición, podemos pasarle esta cómo segundo argumento, opcional.

También podemos efectuar la búsqueda desde el final de la cadena, para encontrar la última aparición del carácter o secuencia en la misma. El método lastIndexOf(caracter) efectúa esta búsqueda. Al igual que el anterior, acepta un segundo argumento opcional indicando una posición límite, y nos mostrará la última aparición del carácter que sea anterior a la posición límite especificada.

Estos dos últimos métodos devuelven la posición dónde se encuentra el carácter buscado, o empieza la secuencia buscada. Si no la encuentran, devuelven el valor -1.

Veamos el uso de estos métodos en el siguiente sketch:

El resultado que aparece en la consola es:

La cadena original es: ---o---o---o---o---
El cuarto caracter de la cadena es: o
La segunda 'o' aparece en la posicion: 7
Este caracter se sustituira con 'a'.
La cadena queda asi: ---o---a---o---o---

En el sketch puedes ver con facilidad cómo se ha hecho uso de los métodos descritos en este apartado.

COMPARACIONES

A la hora de comparar dos cadenas, podríamos optar por los operadores de comparación “tradicionales”, cómo vemos en el siguiente sketch de muestra:

Sin embargo, los objetos de la clase String proporcionan una serie de métodos, heredados de Java, para establecer comparaciones entre cadenas que, además de ser más elaborados, producen un código más claro y aportan más funcionalidades. Los métodos son los siguientes:

  • cadena1.compareTo(cadena2). Compara dos cadenas. Si la cadena que actúa como argumento implícito (cadena1) es mayor que la que pasamos cómo argumento explícito (cadena2), el método devuelve un valor negativo; si son iguales, devuelve un 0; por último, si el argumento explícito es mayor que el implícito, devuelve un valor positivo. Compara las cadenas carácter a carácter por el valor ASCII de cada una, de modo que un carácter a es mayor que un carácter A.
  • cadena1.equals(cadena2). Si ambas cadenas son iguales devuelve un true lógico. En caso contrario, devuelve un false. Compara las cadenas carácter a carácter por el valor ASCII de cada una, de modo que un carácter a es mayor que un carácter A.
  • cadena1.equalsIgnoreCase(cadena2). Esta es la versión insensible a capitalización del método anterior, de modo que un carácter a es iguala un carácter A.
  • cadena.endsWith(caracter_o_secuencia_de_caracteres). Este método devuelve un true lógico si la cadena termina con el carácter o secuencia de caracteres especificado cómo argumento explícito. En caso contrario, devuelve false.
  • cadena.startsWith(caracter_o_secuencia_de_caracteres). Este método devuelve un true lógico si la cadena empieza con el carácter o secuencia de caracteres especificado cómo argumento explícito. En caso contrario, devuelve false.

Cómo ejemplo del uso de algunos de estos métodos, repetimos el sketch anterior, usando, esta vez, las comparaciones adecuadas:

Si bien el resultado parece igual al anterior (vamos, no es que lo parezca, es que es el mismo), este código se basa en el paradigma de la programación orientada a objetos, y es mucho más limpio y legible al ojo experimentado.

TRANSFORMACIONES

Existen algunos métodos para efectuar ciertas tranasformaciones sobre una cadena.

cadena.toUpperCase(). Transforma todos los caracteres alfabéticos de la cadena en mayúsculas. Este método actúa sobre la propia cadena a la que se lo aplicamos. No devuelve una cadena modificada, sino que modifica la original.

cadena.toLowerCase(). Transforma todos los caracteres alfabéticos de la cadena en minúsculas. Este método actúa sobre la propia cadena a la que se lo aplicamos. No devuelve una cadena modificada, sino que modifica la original.

cadena.trim(). Recorta los espacios en blanco por delante y por detrás de la cadena. Este método actúa sobre la propia cadena a la que se lo aplicamos. No devuelve una cadena modificada, sino que modifica la original.

cadena.toCharArray(). Genera una cadena de tipo string (matriz de caracteres) a partir de un objeto String. Ete método recibe dos argumentos. El primero es el nombre de la matriz de caracteres, y el segundo su longitud, es decir, el número de caracteres de la cadena.

cadena.toInt(). Obtiene un valor entero a partir de la cadena, si esta está formada sólo por dígitos o, al menos, empieza por dígitos. Cuando este método encuentra un carácter que no es un dígito interrumpe la conversión. Así, si tenemos una cadena cómo "503a849" el entero resultante será 503.

cadena.toFloat(). Obtiene un valor flotante de una cadena que esté formada por dígitos, o que empiece por estos. Si hay un punto decimal se redondea la parte fraccionaria a dos posiciones.

Vemos la operativa de estos métodos en el siguiente sketch:

El resultado en consola es el siguiente:

Las cadenas son:
        Esta es la primera cadena.            Esta es la segunda cadena.

Recortando los espacios sobrantes de la primera, quedan asi:
Esta es la primera cadena. Esta es la segunda cadena.
Convertimos toda la primera cadena a MAYUSCULAS y toda la segunda a minusculas.
ESTA ES LA PRIMERA CADENA. esta es la segunda cadena.
La primera cadena la pasamos a una matriz de caracteres.
ESTA ES LA PRIMERA CADENA.
La tercera cadena es 2589.048
Convertida a int es: 2589
Convertida a float es: 2589.05

OTROS MÉTODOS

Los objetos de la clase String cuentan con otros métodos que nos facilitan el trabajo con cadenas.

cadena.concat(dato). Permite concatenar un dato pasado como argumento a la cadena. El argumento puede ser otro objeto de cadena, un valor numérico o un dato de tipo string o char. Cómo sabes, no se puede concatenar una cadena con un dato de otro tipo mediante el operador de concatenación +. Intentarlo producirá un error de compilación o, aún peor, no producirá error, pero no mostrará el resultado esperado:

cadena.length(). Devuelve la longitud en caracteres de la cadena.

cadena.substring(desde, hasta). Obtiene una subcadena a partir de una cadena. El primer parámetro es obligatorio. Indica desde que carácter queremos la subcadena. Como la cuenta de caracteres empieza en 0, si queremos que la subcadena se obtenga desde el principio de la cadena, este primer parámetro valdrá, precisamente, 0. El segundo parámetro es opcional. Si no indicamos nada, se cogerá la subcadena hasta el final de la cadena. Si pasamos un valor menor que el número de caracteres de la cadena, la subcadena terminará en el carácter indicado por este segundo parámetro.

cadena.remove(inicial, total). Elimina uno o más caracteres de la cadena. El segundo argumento es opcional. Si sólo establecemos el primer argumento, se eliminará el carácter que este en la posición indicada por dicho argumento. Así. si le pasamos el valor 3, se eliminará el cuarto carácter (recuerda que se empieza a contar por 0). Si establecemos el segundo argumento, este se refiere al número de caracteres a eliminar. Si, en el caso descrito, el segundo argumento es 2, se eliminarían los caracteres cuarto y quinto.

     

Un comentario:

  1. Pingback: ARD-SYN 05 – Sintaxis (V). Tipos de datos » eldesvandejose.com

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *