Autor Tema: Ejemplo substring Java Ejercicio del tutoria CU00657B Pedir datos por consola.  (Leído 7049 veces)

Dan_SB

  • Avanzado
  • ****
  • Mensajes: 273
  • *<DanielsCK>*
    • Ver Perfil
Muy buenos días tengan todos!!

En esta preciosa tarde en la Universidad, decidí leer un capitulo y desarrollar el siguiente ejercicio del curso... su enunciado dice así:

Crea una clase con un método main que pida una entrada de teclado y usando condicionales, el método length de la clase String y el método substring de la clase String, muestre un mensaje indicando:

a) Si la cadena introducida tiene menos de 5 caracteres, entre 5 y 15 caracteres o más de 15 caracteres.

b) Si la cadena introducida comienza por la letra a.


Presento mi código. Mi clase para los 2 métodos que voy a utilizar...

Clase Metodos:

Código: [Seleccionar]
package Caracteres;
import java.util.Scanner;

public class Metodos {
public Metodos(){}

public String Lectura(){
    Scanner lea = new Scanner (System.in);
    String palabra = lea.nextLine();
    return palabra;
}

public void Comprobacion(){
    String caracter, Primero;
       int num;
       Metodos Lectura = new Metodos();
       System.out.println("Ingrese una cadena de caracteres: ");
       caracter = Lectura.Lectura();
       num = caracter.length();
       if (num < 5){
           System.out.println("La cadena tiene menos de 5 caracteres.");
       }
       else if (num >= 5 && num <= 15){
           System.out.println("La cadena tiene entre 5 y 15 caracteres.");
       }
       else if (num > 15){
           System.out.println("La cadena tiene mas de 15 caracteres.");
       }
       Primero = caracter.substring(0, 1);
       if(Primero.matches("a") || Primero.matches("A")){
           System.out.println("La cadena empieza con A.");
       }
       else
           System.out.println("La cadena no empieza con A.");
}

Aquí cree un método para lectura de cadenas de caracteres (String). Lo decidí colocar aquí para que el main tenga el menor código posible (no se si sea practico). Al inicio me cerre un poco con la ultima parte... esa de decir que si empieza con A o no. Pense que solo debía usar el metodo length y substring... pero cuando intentaba usar el substring en cierto punto (para comprobar si el primer caracter era A) me soltaba error...

En el ultimo If intente colocar esto para intentar comprobar... caracteres.substring(0,1) == "a" pero fue sin éxito.. perdonen si tuve que hacer trampa y usar el match (pense tambien en un equals xD) pero igual tuve que utilizar el substring para extraer el primer carácter!!!

Clase Main:

Código: [Seleccionar]
package Caracteres;
public class Main {
   public static void main(String[]args){
       Metodos Compara; Compara = new Metodos();
       Compara.Comprobacion();
   }
}


Ejecución:





Cualquier corrección, o comentario se los agradeceria mucho. Y si es posible comprobar tan solo usando un substring, se le agradeceria mucho comentar su solucion.

Mil gracias!!
« Última modificación: 05 de Abril 2015, 23:54 por Alex Rodríguez »
"Luchar por tus sueños y cumplirlos... eso es vivir.."

Jorge lopez

  • Sniper
  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 248
  • @SniperOfElite
    • Ver Perfil
Re:Ejercicio (CU00657B), Pedir datos en Java por consola.
« Respuesta #1 en: 02 de Abril 2015, 23:33 »
 Hola Dan_SB!

Tu respuesta a este ejercicio cumple con lo requerido en el enunciado de este, no obstante podemos corregir y mejorar tu respuesta (código)

1ro: Siempre asegúrate de que el código de clase que publiques en los foros compile, para esto te recomiendo que una vez pegues el código en la web, lo copies desde la web y lo lleves a bluej nuevamente y lo compiles para comprobar que todo esta bien. En tu clase Metodos te ha faltado la llave de cierre de clase } por lo que tuve que incluirla para poder compilar la clase.

El enunciado pide que se cree una clase con un método main, tu decidiste crear 2 clases, esto no es ningún problema, lo que si te recomiendo es que a la hora de asignar un nombre de clase pienses en un nombre descriptivo a lo que es o a lo que hace dicha clase, un nombre de clase como Metodos en lo personal no lo encuentro muy adecuado. Basándome en lo que hace la clase yo hubiese optado por un nombre de clase como: AnalizarCadena (porque analiza su tamaño y su primera letra) o AnalizarTexto ext..

En el metodo Comprobacion de tu clase Metodos tienes esta linea de codigo:
Citar
caracter = Lectura.Lectura();
No es recomendable duplicar palabras en una clase a menos de no ser muy necesario, tu has asignado el mismo nombre para un método y una variable. (Lectura) También debes de recordar que los nombres de clases es preferible que comiencen con una letra mayúscula, mientras que los nombres de variables y métodos deben de comenzar con una letra minúscula.

Con respecto a tu inquietud:
Citar
Aquí cree un método para lectura de cadenas de caracteres (String). Lo decidí colocar aquí para que el main tenga el menor código posible (no se si sea practico).
Un método main nunca tendrá mucho código siempre y cuando el código que implemente sea código necesario y prudente para dirigir el flujo o desarrollo del programa o código, así que no esta de mas que un método main tenga algunas lineas de código mas que solo las de crear una instancia de clase y llamar un método de dicha instancia.

Usar el método matches en este ejercicio no es que este bien ni mal, esta bien porque es bueno siempre saber que mientras programamos podemos obtener un mismo resultado de diferentes maneras y es bueno poder tener ese dominio, pero también esta mal porque te has rendido al no poder hacerlo como lo pide el enunciado, estos ejercicios están elaborados afin de que el alumno o usuario use recursos aprendidos en unidades anteriores a la del ejercicio o recursos aprendidos en la misma unidad de este. Si puedes usar tanto los métodos substring y equals como el método matches para resolver esto, pues esta todo bien, si solo lo puedes resolver usando el método matches pues debes de esforzarte para dominarlo de ambas formas.

A continuación dejo una posible respuesta a este ejercicio, con algunos comentarios que te podrían ser útiles:
Código: [Seleccionar]

import java.util.Scanner;
public class AnalizarTexto
{
    public static void main(String []args)
    {
        System.out.println(" Hola!\nPor favor introduce un texto\n");//El método main se encarga de saludar al usuario y dirige el programa
        String cadena, primeraLetra;
        Scanner sc = new Scanner(System.in);
        cadena = sc.nextLine();//Aqui capturamos la cadena introducida por el usuario
        primeraLetra = cadena.substring(0, 1);//Aqui capturamos la primera letra de la cadena de caracteres introducida
        System.out.println("\fEl texto introducido es: " + cadena);
        int numeroCaracteres = cadena.length();//Aqui capturamos la cantidad de caracteres
        if(numeroCaracteres < 5 && primeraLetra.equals("a") || numeroCaracteres < 5 && primeraLetra.equals("A"))//Utilizamos el metodo equals
        {
            System.out.println("\nEl texto introducido consta de menos de 5 caracteres y comienza con la letra \"" + primeraLetra + "\".");
        }
        else if(numeroCaracteres < 5)
        {
            System.out.println("\nEl texto introducido consta de menos de 5 caracteres y no comienza con la letra \"" + "a/A" + "\".");
        }
        else if(numeroCaracteres >=5 && numeroCaracteres <=15 && primeraLetra.equalsIgnoreCase("a"))/*Utilizamos el metodo equalsIgnoreCase, este metodo evalua si
        la letra es "a" o "A" solo pasandole como parametro la letra en cualquiera de sus dos estados (minuscula o mayuscula) */
        {
            System.out.println("\nEl texto introducido consta de entre 5 y 15 caracteres y comienza con la letra \"" + primeraLetra + "\".");
        }
        else if(numeroCaracteres >=5 && numeroCaracteres <=15)
        {
            System.out.println("\nEl texto introducido consta de entre 5 y 15 caracteres y no comienza con la letra \"" + "a/A" + "\".");
        }
        else if(numeroCaracteres >= 16 && primeraLetra.matches("a") || numeroCaracteres >= 16 && primeraLetra.matches("A"))//Utilizamos el metodo matches
        {
            System.out.println("\nEl texto introducido consta de "  + numeroCaracteres + " caracteres y comienza con la letra \"" + primeraLetra + "\".");
        }
        else if(numeroCaracteres >=16)
        {
            System.out.println("\nEl texto introducido consta de "  + numeroCaracteres + " caracteres y no comienza con la letra \"" + "a/A" + "\".");
        }
        else{}
    }
}

Saludos!!
while(estesVivo)
{
  aprende();
  ayuda();
  enseña();
}
if(mueres){teRecordaran();}
By: https://twitter.com/SniperOfElite

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2074
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:Ejercicio (CU00657B), Pedir datos en Java por consola.
« Respuesta #2 en: 03 de Abril 2015, 11:56 »
Hola Jorge hacía un tiempo que no te veía por los foros y ya estaba pensando que nos habías abandonado, pero ahí veo que sigues con tu lema

while(estesVivo)
{
  aprende();
  ayuda();
  enseña();
}
if(mueres){teRecordaran();}

Me alegro de ver que sigues por aquí, además de que nos viene muy bien que nos eches una mano con los novatos

Saludos!!
Responsable de departamento de producción aprenderaprogramar.com

Jorge lopez

  • Sniper
  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 248
  • @SniperOfElite
    • Ver Perfil
Re:Ejercicio (CU00657B), Pedir datos en Java por consola.
« Respuesta #3 en: 03 de Abril 2015, 15:09 »
 Hola Krall!

El trabajo y poco tiempo libre son los factores que han limitado mi actividad en los foros, pero mucho que poco sigo y seguiré echándonos una mano por aquí.

Saludos!!  :)
while(estesVivo)
{
  aprende();
  ayuda();
  enseña();
}
if(mueres){teRecordaran();}
By: https://twitter.com/SniperOfElite

Dan_SB

  • Avanzado
  • ****
  • Mensajes: 273
  • *<DanielsCK>*
    • Ver Perfil
Re:Ejercicio (CU00657B), Pedir datos en Java por consola.
« Respuesta #4 en: 03 de Abril 2015, 17:17 »
Hola Jorge!

Mil Gracias por tu respuesta. Solo quisiera aclararme una duda con respecto a este comentario:

Citar
Usar el método matches en este ejercicio no es que este bien ni mal, esta bien porque es bueno siempre saber que mientras programamos podemos obtener un mismo resultado de diferentes maneras y es bueno poder tener ese dominio, pero también esta mal porque te has rendido al no poder hacerlo como lo pide el enunciado, estos ejercicios están elaborados afin de que el alumno o usuario use recursos aprendidos en unidades anteriores a la del ejercicio o recursos aprendidos en la misma unidad de este.

Ya me lo temía... por eso pense 3 veces antes de recurrir a usar el match. Se podía hacer tan solo con un substring??? Si es así, como??

Yo pense que escribiendo cadena.substring(0,1) == "a" funcionaria pero no. Por ahi lei mas adelante que tu no puedes comparar un objeto con ==, solo es valido con los tipos primitivos... Ya me imagino porque me paso esto, porque el String es un objeto.. 

Creo que ya se me prendio el bombillo. Dejame volver a intentarlo sin match. Si no puedo vengo de nuevo a preguntar! Muchisimas gracias!
"Luchar por tus sueños y cumplirlos... eso es vivir.."

Dan_SB

  • Avanzado
  • ****
  • Mensajes: 273
  • *<DanielsCK>*
    • Ver Perfil
Re:Ejercicio (CU00657B), Pedir datos en Java por consola.
« Respuesta #5 en: 03 de Abril 2015, 19:02 »
Hola de nuevo!!

No pude encontrar una solución sin "hacer trampas", osea... solo utilizar hasta donde he visto en este curso y no utilizar métodos ni soluciones de afuera. Lo pude hacer sin match usando un substring... pero con un truquillo colado. Usando un char pude comprobar si empezaba con A , pero claro, tuve que extraer la primera letra con substring y luego convertir ese dato a char:

Clase AnalizarCadena:

Código: [Seleccionar]
package Caracteres;
import java.util.Scanner;

public class AnalizarCadena {
public AnalizarCadena(){}

public String Lectura(){
    Scanner lea = new Scanner (System.in);
    return lea.nextLine();
}

public void Comprobacion(){
       String caracter, aux;
       char primero;
       int num;
       System.out.println("Ingrese una cadena de caracteres: ");
       caracter = Lectura();
       num = caracter.length();
       if (num < 5){
           System.out.println("La cadena tiene menos de 5 caracteres.");
       }
       else if (num >= 5 && num <= 15){
           System.out.println("La cadena tiene entre 5 y 15 caracteres.");
       }
       else if (num > 15){
           System.out.println("La cadena tiene mas de 15 caracteres.");
       }
       aux = caracter.substring(0, 1);
       primero = aux.charAt(0); // Conversion a char.
       if(primero == 'A' || primero == 'a'){
           System.out.println("La cadena empieza con A.");
       }
       else
           System.out.println("La cadena no empieza con A.");
}
}

Se me hace difícil pensar como podría yo comprobar el primer carácter sin hacer trampas. ¿Sabrás como podre yo realizar eso?...Hasta ahora en este ejercicio, veo que siempre vas a necesitar algo adicional para comprobar. :s

Muchas gracias de nuevo
"Luchar por tus sueños y cumplirlos... eso es vivir.."

Jorge lopez

  • Sniper
  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 248
  • @SniperOfElite
    • Ver Perfil
Re:Ejercicio (CU00657B), Pedir datos en Java por consola.
« Respuesta #6 en: 03 de Abril 2015, 22:26 »
A ver!

Primero extraemos el primer carácter de la cadena introducida usando substring, podría ser algo así:

Código: [Seleccionar]
String primerCaracter;
primerCaracter = cadena.substring(0, 1);

y luego usamos el método equals y no == para comparar dos tipo String, puesto que un tipo String es también un tipo Object y ha de compararse usando equals. Podría ser algo asi:

Código: [Seleccionar]
if(primerCaracter.equals("a") || primerCaracter.equals("A")){...}
Con esto es suficiente para no usar el método matches, o tener que convertir de String a char.
(que no es trampa por cierto, pero si es bueno dominar el tema de todas las formas)

Tus clases quedarían asi:
Código: [Seleccionar]
import java.util.Scanner;

public class AnalizarCadena {
public AnalizarCadena(){}

public String lectura(){
    Scanner lea = new Scanner (System.in);
    return lea.nextLine();
}

public void comprobacion(String caracteres){
       int num;
       String primerCaracter;
       primerCaracter = caracteres.substring(0, 1);
       num = caracteres.length();
       
       if (num < 5){
           System.out.println("\nLa cadena tiene menos de 5 caracteres.");
       }
       else if (num >= 5 && num <= 15){
           System.out.println("\nLa cadena tiene entre 5 y 15 caracteres.");
       }
       else if (num > 15){
           System.out.println("\nLa cadena tiene mas de 15 caracteres.");
       }
     
       if(primerCaracter.equals("a") || primerCaracter.equals("A")){
           System.out.println("\nLa cadena empieza con " + primerCaracter);
       }
       else
           System.out.println("\nLa cadena no empieza con a/A.");
}
}

Código: [Seleccionar]
public class Main {
    public static void main (String[]args){ 
         String caracteres;
         AnalizarCadena cadena = new AnalizarCadena();
         System.out.println("Ingrese una cadena de caracteres:\n");
         caracteres = cadena.lectura();
         cadena.comprobacion(caracteres);
    }
}

Saludos!!
while(estesVivo)
{
  aprende();
  ayuda();
  enseña();
}
if(mueres){teRecordaran();}
By: https://twitter.com/SniperOfElite

Dan_SB

  • Avanzado
  • ****
  • Mensajes: 273
  • *<DanielsCK>*
    • Ver Perfil
Re:Ejercicio (CU00657B), Pedir datos en Java por consola.
« Respuesta #7 en: 04 de Abril 2015, 01:38 »
Ah okay, entonces no es trampa, gracias por aclararme esto!
Graciassss   ;D
"Luchar por tus sueños y cumplirlos... eso es vivir.."

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".