Autor Tema: Ejercicio! entrega CU00662B comparar cadenas letra a letra java  (Leído 10835 veces)

Jorge lopez

  • Sniper
  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 248
  • @SniperOfElite
    • Ver Perfil
  Hola!
he creado un programa al que llamo: ComparandoCadenas, el cual fue creado a partir de las peticiones indicadas por este ejercicio, he comenzado a crear mis programas bajo la filosofía de orientación a objetos, por lo cual e creado 5 clases diferentes que definen objetos y los utilizan entre si, mas una sexta clase que incluye el método main y utiliza objetos de cada una de las otras 5 clases para el completo funcionamiento del "programa"

a continuación el código de cada clase:

EntradaPorTeclado
esta clase pide al usuario que introduzca 2 cadenas de caracteres y almacena cada cadena en una variable tipo String
Código: [Seleccionar]
import java.util.Scanner;
public class EntradaPorTeclado{
   public static String entrada1;
   public static String entrada2;
   public EntradaPorTeclado(){
        System.out.println("Por favor introduzca la primera cadena.");
        Scanner escaner = new Scanner(System.in);
        entrada1 = "";
        entrada2 = "";
        entrada1 = escaner.nextLine();
        System.out.println("ahora introduzca la segunda cadena.");
        entrada2 = escaner.nextLine();
    }
   public String getEntrada1(){return entrada1;}
   public String getEntrada2(){return entrada2;}
}
ComparandoCaracterXCaracter
esta clase usa las variables de la clase EntradaPorTeclado que almacenan lo que  ha escrito el usuario para asi realizar una comparacion de caracteres entre las dos cadenas.
Código: [Seleccionar]
public class ComparandoCaracterXCaracter{
   private String comparandoEntrada1, comparandoEntrada2;
  public ComparandoCaracterXCaracter(){
     System.out.println("Gracias \nEste es el resultdo de la comparacion entre las dos cadenas que as introducido: \n");
     comparandoEntrada1 = EntradaPorTeclado.entrada1;
     comparandoEntrada2 = EntradaPorTeclado.entrada2;
     int i = 0;
     int entradaMasLarga = 0;
     int entradaMasCorta = 0;
     if(comparandoEntrada1.length() > comparandoEntrada2.length())
         {entradaMasLarga = comparandoEntrada1.length();}
     else
         {entradaMasLarga = comparandoEntrada2.length();
     }
     
     if(comparandoEntrada1.length() < comparandoEntrada2.length())
         {entradaMasCorta = comparandoEntrada1.length();}
     else
         {entradaMasCorta = comparandoEntrada2.length();
     }
     
     do{
        System.out.print("¿Es el caracter " + (i+1) + " igual en las dos cadenas? ");
        if(comparandoEntrada1.substring(i,(i+1)).equals(comparandoEntrada2.substring(i,(i+1))))
            {System.out.print(" Si\n");}
        else
            {System.out.print(" No\n");
                                              } i++;                                 
        }while( i < entradaMasCorta);
     
        if(comparandoEntrada1.length() > comparandoEntrada2.length())
      {System.out.println("\nLa primera cadena excede por " + (comparandoEntrada1.length() - comparandoEntrada2.length()) + " caracteres " +
        " a la segunda cadena, por tanto solo se compararon los primeros " + entradaMasCorta + " caracteres de cada cadena. \n");
     }
     else if(comparandoEntrada2.length() > comparandoEntrada1.length())
      {System.out.println("\nLa segunda cadena excede por " + (comparandoEntrada2.length() - comparandoEntrada1.length()) + " caracteres " +
        " a la primera cadena, por tanto solo se compararon los primeros " + entradaMasCorta + " caracteres de cada cadena. \n");
     }
    }
}
CaracteresSobrantes
esta clase usa la clase EntradaPorTeclado para calcular cuales son los caracteres de la cadena mas larga, que sobran y no se comparan.
Código: [Seleccionar]
public class CaracteresSobrantes{
    private String entrada1Sobrantes, entrada2Sobrantes;
    public CaracteresSobrantes(){
        entrada1Sobrantes = EntradaPorTeclado.entrada1;
        entrada2Sobrantes = EntradaPorTeclado.entrada2;
        String sobrantes = "";
        int i = 0;
       if      (entrada1Sobrantes.length() > entrada2Sobrantes.length())
          {sobrantes = entrada1Sobrantes.substring(entrada2Sobrantes.length(),entrada1Sobrantes.length()); 
        }
        else if(entrada2Sobrantes.length() > entrada1Sobrantes.length())
          {sobrantes = entrada2Sobrantes.substring(entrada1Sobrantes.length(),entrada2Sobrantes.length());
        }
       
       if(entrada1Sobrantes.length() > entrada2Sobrantes.length())
        {System.out.println("Los caracteres sobrantes de la primera cadena son: \n");
         while(i < sobrantes.length()){System.out.println("Caracter " + (i+entrada2Sobrantes.length()+1) + ": " + sobrantes.substring(i,(i+1))); i++;}
        }
       
       else if(entrada2Sobrantes.length() > entrada1Sobrantes.length())
        {System.out.println("Los caracteres sobrantes de la segunda cadena son: \n");
         while(i < sobrantes.length()){System.out.println("Caracter " + (i+entrada1Sobrantes.length()+1) + ": " + sobrantes.substring(i,(i+1))); i++;}
       }
    }
    }
VocalesCadena1
esta clase usa a la clase EntradaPorTeclado para detectar las vocales que se encuentren en la primera cadena
Código: [Seleccionar]
public class VocalesCadena1{
   private String compuesto1;
   public VocalesCadena1(){
      compuesto1 = EntradaPorTeclado.entrada1;
       int vocales = 1;
       int i = 0;
      System.out.println("\nEstas son las vocales detectadas en la primera cadena, enumeradas por orden de aparicion:");
       while(i < compuesto1.length()){
         if(compuesto1.substring(i,(i+1)).equals("a") || compuesto1.substring(i,(i+1)).equals("e") || compuesto1.substring(i,(i+1)).equals("i") ||
          compuesto1.substring(i,(i+1)).equals("o") || compuesto1.substring(i,(i+1)).equals("u")){
             System.out.println("vocal " + vocales++ + " :" + compuesto1.substring(i,(i+1)));}  i++;
      }
      if(vocales == 1){System.out.println("\"" + "ninguna vocal detectada en la primera cadena" + "\".\n");}
    }
}
VocalesCadena2
esta clase usa a la clase EntradaPorTeclado para detectar las vocales que se encuentren en la segunda cadena
Código: [Seleccionar]
public class VocalesCadena2{
    private String compuesto2;
      public  VocalesCadena2(){
       compuesto2 = EntradaPorTeclado.entrada2;
       int vocales = 1;
       int i = 0;
       System.out.println("Estas son las vocales detectadas en la segunda cadena, enumeradas por orden de aparicion:");
        while(i < compuesto2.length()){
         if(compuesto2.substring(i,(i+1)).equals("a") || compuesto2.substring(i,(i+1)).equals("e") || compuesto2.substring(i,(i+1)).equals("i") ||
          compuesto2.substring(i,(i+1)).equals("o") || compuesto2.substring(i,(i+1)).equals("u")){
             System.out.println("vocal " + vocales++ + " :" + compuesto2.substring(i,(i+1)));}  i++;
       }
       if(vocales == 1){System.out.println("\"" + "ninguna vocal detectada en la segunda cadena" + "\".\n");}
    }
}
ComparandoCadenas esta clase contiene el método main y se encarga de:
1ro saluda al usuario y le recuerda para que sirve el programa.
2do crea objetos de cada una de las otras 5 clases y ejecuta sus métodos en el orden que se definan en esta clase.
y 3ro se despide del usuario.
Código: [Seleccionar]
public class ComparandoCadenas{
     //nada que declarar
    public static void main(String []args){
      System.out.println("Hola! \nbamos a comparar dos cadenas caracter por caracter.");
      EntradaPorTeclado entrada = new EntradaPorTeclado();
      ComparandoCaracterXCaracter caracter = new ComparandoCaracterXCaracter();
      CaracteresSobrantes sobrantes = new CaracteresSobrantes();
      VocalesCadena1 compuesto1 = new VocalesCadena1();
      VocalesCadena2 compuesto2 = new VocalesCadena2();
      System.out.println("Gracias por comparar cadenas \nHasta luego \n@SniperOfElite, follow me on #Twitter (#^_^#).");

   }
}
Espero sus criticas constructivas para mejorar mi programa y mi calidad de "programador"
Salu2!
« Última modificación: 31 de Agosto 2014, 11:27 por Alex Rodríguez »
while(estesVivo)
{
  aprende();
  ayuda();
  enseña();
}
if(mueres){teRecordaran();}

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:Ejercicio! entrega CU00662B
« Respuesta #1 en: 10 de Julio 2014, 22:42 »
Hola, el código se ve bien trabajado, se puede decir que funciona, pero hay bastante que mejorar y que comentar.

Clase EntradaPorTeclado: como su nombre indica, lo lógico es que tenga la misión de manejar entradas de teclado (digamos que pedirlas, almacenarlas, etc.). Sin embargo la declaras con 2 atributos entrada1 y entrada2, y en el constructor se pide al usuario que introduzca dichos atributos.

Esto no es un buen diseño: según la filosofía de orientación a objetos, la clase EntradaPorTeclado sería más lógico que tuviera a lo sumo 1 atributo (que representaría la propia entradaPorTeclado). Para manejar dos entradas de teclado, crearías dos objetos. Y esa creación la harías en el método main o en otra clase, no en el constructor de la clase EntradaPorTeclado.

Otro fallo: los atributos de una clase deben declararse private, no public.


Clase ComparandoCaracterXCaracter: El código puede estar bien, pero el diseño no es correcto. Cosas que fallan:

- Un constructor (al menos en una primera aproximación) sirve para inicializar los atributos de la clase, no para mostrar mensajes, realizar cálculos, comparaciones, ni otro tipo de cosas. ¿Incluir todo un proceso en un constructor? Mal diseño.


Clase CaracteresSobrantes: idem. Otra cosa que no es un buen diseño es hacer que los atributos de una clase sean los atributos de una clase. Cada clase tiene sus atributos, y no hay dependencia (en principio) entre los atributos de una clase y los de otra.

Clase VocalesCadena2: lo mismo indicado.

Clase ComparandoCadenas: es la clase con el método main. ¿Del código de esta clase podemos ver cómo crea objetos y hace que interaccionen entre ellos, conduciendo el proceso global? No. Más bien al analizar el código parece que quien condujera el proceso fuera la clase EntradaPorTeclado, cosa que no debe ocurrir. Quien debe conducir el programa es la clase con el método main.

A modo de resumen:

Fallos graves de diseño: usar los constructores para realizar procesos. Usar atributos de una clase A para incorporarlos como atributos de otra clase B. Delegar el flujo del programa en una clase que no es la clase con el método main.

Recomendaciones: el nombre de una clase dice lo que es, o lo que hace. Si el nombre representa lo que es una clase, será tipo EntradaPorTeclado, ListaPalabras, Vocal, Sorteo, etc. Si el nombre representa lo que hace se llamará ComparadorDeCaracteres, ComparadorDeCadenas, AnalizadorDeCaracteresSobrantes, etc.

Recomendación: antes de escribir código, hacer el diseño de clases escribiendo para cada clase:

- Cuáles serán sus atributos (información que almacena)

- Cuáles serán sus métodos (operaciones que es capaz de realizar)

Recomendación: ver el diseño que han hecho otras personas que están realizando los cursos y que están colgados en el foro.


Si una clase no tiene métodos, con bastante probabilidad está mal diseñada (excepto la clase con el main). Si una clase no tiene atributos propios, en general será porque es una clase "manejadora" de información que le pasan otros objetos y se encarga de realizar procesos y devolver un resultado.

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

Jorge lopez

  • Sniper
  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 248
  • @SniperOfElite
    • Ver Perfil
Ejercicio! entrega CU00662B código replanteado.
« Respuesta #2 en: 15 de Julio 2014, 00:49 »
 Quien dijo que aprender java seria una tarea sencilla??
se necesita de mucha perseverancia y esfuerzo.

a continuación replanteo mi código, mejorado a partir de los puntos y consejos señalados por Cesar (Moderador)

ComparadorDeCadenas
Código: [Seleccionar]
public class ComparadorDeCadenas{
   private static String cadena = "", entrada1 = "", entrada2 = "", volver = "";
   private static boolean vacio = false;
   public ComparadorDeCadenas(){
       
       
    }
   
    public static void main(String []args){
      System.out.println("Hola! \nbamos a comparar dos cadenas carácter por carácter. \n"); 
      do{     
      manejadorDeEntradas();
      System.out.println("este es el resultado de la comparación entre las dos cadenas que has escrito: \n");
      comparandoCaracteres();
      entradaMasLarga();
      if(entrada1.length() == entrada2.length())
        {System.out.println("\n\tambas cadenas constan de " + entrada1.length() + " caracteres.");}
      else if(entrada1.length() > entrada2.length()){System.out.println("\nestos son los caracteres sobrantes de la primera cadena:"); sobran();}
      else if(entrada1.length() < entrada2.length())
        {System.out.println("\nestos son los caracteres sobrantes de la segunda cadena:"); sobran();
      }
      System.out.println("\nEstas son las vocales detectadas en la primera cadena, enumeradas por orden de aparición:");
      vocales1();
      System.out.println("\nEstas son las vocales detectadas en la segunda cadena, enumeradas por orden de aparición:");
      vocales2();
     
      System.out.println("\nSi deseas volver a comparar dos cadenas presiona cualquier tecla, o simplemente presiona la tecla enter para finalizar.");
      volver = entradaDeCadena();
     }while(volver.length() > 0);
      System.out.println("Gracias por comparar cadenas \nHasta luego.");
   }
   
   private static String entradaDeCadena(){
        EntradaPorTeclado entrada = new EntradaPorTeclado();
        return entrada.getEntrada();
    }
   
   private static void manejadorDeEntradas(){
      do {
            System.out.println ("Por favor, introduce la primera cadena.");
            cadena = entradaDeCadena();
            if (cadena.length() == 0) {
                vacio = true;
                System.out.println ("Disculpa, pero no as escrito nada.");
            } else {
                entrada1 = cadena;
                vacio = false;
            }
        } while (vacio);
       
      do {
            System.out.println ("Por favor, introduce la segunda cadena.");
            cadena = entradaDeCadena();
            if (cadena.length() == 0) {
                vacio = true;
                System.out.println ("Disculpa, pero no as escrito nada.");
            } else {
                entrada2 = cadena;
                vacio = false;
            }
        } while (vacio);
    }
   
   private static void comparandoCaracteres(){
    ComparadorDeCaracteres comparando = new ComparadorDeCaracteres(entrada1, entrada2);
    comparando.comparando();
    }
   
   private static void entradaMasLarga(){
    DetectorDeCadenaMasLarga masLarga = new DetectorDeCadenaMasLarga(entrada1, entrada2);
    masLarga.detectando();
    }
   
   private static void sobran(){
    AnalizadorDeCaracteresSobrantes sobrantes = new AnalizadorDeCaracteresSobrantes(entrada1, entrada2);
    sobrantes.extractorDeCaracteresSobrantes();
    }
   
   private static void vocales1(){
    AnalizadorVocalesCadena1 cadena1 = new AnalizadorVocalesCadena1(entrada1);
    cadena1.extractorDeVocales();
    }
   
   private static void vocales2(){
    AnalizadorVocalesCadena2 cadena2 = new AnalizadorVocalesCadena2(entrada2);
    cadena2.extractorDeVocales();
    }
   //gette
   public static String getEntrada1(){return entrada1;}
   
   public static String getEntrada2(){return entrada2;}
}
EntradaPorTeclado
Código: [Seleccionar]
import java.util.Scanner;
public class EntradaPorTeclado{
     private String entrada;
   public EntradaPorTeclado(){
        entrada = "";
        entradaTeclado();
      }
   
   public void entradaTeclado(){
       Scanner escaner = new Scanner(System.in);
       entrada = escaner.nextLine();
      }
   
   public String getEntrada(){return entrada;}
   
   public int getLongitudEntrada(){return entrada.length();}
 }
ComparadorDeCaracteres
Código: [Seleccionar]
public class ComparadorDeCaracteres{
   private int i, entradaMasCorta;
   private String entrada1, entrada2;
  public ComparadorDeCaracteres(String valorEntrada1, String valorEntrada2){
      i = 0;
      entradaMasCorta = 0;
      entrada1 = valorEntrada1;
      entrada2 = valorEntrada2;
    }
   
  public void comparando(){
     if(entrada1.length() < entrada2.length())
         {entradaMasCorta = entrada1.length();
     }
     else if(entrada1.length() > entrada2.length())
         {entradaMasCorta = entrada2.length();       
     }
     else if(entrada1.length() == entrada2.length())
         {entradaMasCorta = entrada1.length();
     }
     
     do{
        System.out.print("\t¿Es el carácter " + (i+1) + " igual en las dos cadenas? ");
        if(entrada1.substring(i,(i+1)).equals(entrada2.substring(i,(i+1))))
          {System.out.print(" Si. En la primera cadena  \"" + entrada1.substring(i,(i+1)) + "\"" + "  " + "\"" + entrada2.substring(i,(i+1)) + "\"" + " en la segunda cadena\n");}
        else
          {System.out.print(" No. En la primera cadena  \"" + entrada1.substring(i,(i+1)) + "\"" + "  " + "\"" + entrada2.substring(i,(i+1)) + "\"" + " en la segunda cadena\n");
                                              } i++;                                 
        }while( i < entradaMasCorta);
     

    }
    //getters
  public int getI(){return i;}
 
  public int getEntradaMasCorta(){return entradaMasCorta;}
 
  public String getEntrada1(){return entrada1;}
 
  public String getEntrada2(){return entrada2;}
}
DetectorDeCadenaMasLarga
Código: [Seleccionar]
public class DetectorDeCadenaMasLarga{
 private int cadenaMasLarga, cadenaMasCorta;
 private String cadena1, cadena2;
 
 public DetectorDeCadenaMasLarga(String valorCadena1, String valorCadena2){
     cadena1 = valorCadena1;
     cadena2 = valorCadena2;
          if(cadena1.length() > cadena2.length())
         {cadenaMasLarga = cadena1.length();}
     else
         {cadenaMasLarga = cadena2.length();
     }
     
     if(cadena1.length() < cadena2.length())
         {cadenaMasCorta = cadena1.length();}
     else
         {cadenaMasCorta = cadena2.length();
     }
    }
   
 public void detectando(){
         if(cadena1.length() > cadena2.length())
      {System.out.println("\nLa primera cadena excede por " + (cadena1.length() - cadena2.length()) + " caracteres " +
        " a la segunda cadena, por tanto solo se compararon los primeros " + cadenaMasCorta + " caracteres de cada cadena. \n");
     }
     else if(cadena2.length() > cadena1.length())
      {System.out.println("\nLa segunda cadena excede por " + (cadena2.length() - cadena1.length()) + " caracteres " +
        " a la primera cadena, por tanto solo se compararon los primeros " + cadenaMasCorta + " caracteres de cada cadena. \n");
     }   
    }

}
AnalizadorDeCaracteresSobrantes
Código: [Seleccionar]
public class AnalizadorDeCaracteresSobrantes{
    private String sobrantes, cadena1, cadena2;
    private int i;
    public AnalizadorDeCaracteresSobrantes(String valorCadena1, String valorCadena2){
        sobrantes = "";
        cadena1 = valorCadena1;
        cadena2 = valorCadena2;
        int i = 0;
    }
   
    public void extractorDeCaracteresSobrantes(){
       if      (cadena1.length() > cadena2.length())
          {sobrantes = cadena1.substring(cadena2.length(),cadena1.length()); 
        }
        else if(cadena1.length() < cadena2.length())
          {sobrantes = cadena2.substring(cadena1.length(),cadena2.length());
        }
       
       if(cadena1.length() > cadena2.length())
        {
         while(i < sobrantes.length()){System.out.println("\tCaracter " + (i+cadena2.length()+1) + ": " + sobrantes.substring(i,(i+1))); i++;}
        }
       else if(cadena2.length() > cadena1.length())
        {
         while(i < sobrantes.length()){System.out.println("\tCaracter " + (i+cadena1.length()+1) + ": " + sobrantes.substring(i,(i+1))); i++;}
       }
    }
   
    public String getSobrantes(){return sobrantes;}
    }
AnalizadorVocalesCadena1
Código: [Seleccionar]
public class AnalizadorVocalesCadena1{
    private int vocales, i;
    private String cadena1;
   public AnalizadorVocalesCadena1(String valorCadena1){
      vocales = 1;
      i = 0;
      cadena1 = valorCadena1;
    }
   
   public void extractorDeVocales(){
       while(i < cadena1.length()){
         if(cadena1.substring(i,(i+1)).equals("a") || cadena1.substring(i,(i+1)).equals("e") ||
         cadena1.substring(i,(i+1)).equals("i") ||
          cadena1.substring(i,(i+1)).equals("o") || cadena1.substring(i,(i+1)).equals("u")){
             System.out.println("\tvocal " + vocales++ + " :" + cadena1.substring(i,(i+1)));}  i++;
      }
      if(vocales == 1){System.out.println("\t\"" + "ninguna vocal detectada en la primera cadena" + "\"");}
    }
   //getters
   public int getTotalVocalesCadena1(){return vocales;}
   
   public int getI(){return i;}
   
   public String getVocalesCadena1(){return cadena1;}
}
AnalizadorVocalesCadena2
Código: [Seleccionar]
public class AnalizadorVocalesCadena2{
    private int vocales, i;
    private String cadena2;
   public AnalizadorVocalesCadena2(String valorCadena2){
      vocales = 1;
      i = 0;
      cadena2 = valorCadena2;
    }
   
   public void extractorDeVocales(){
       while(i < cadena2.length()){
         if(cadena2.substring(i,(i+1)).equals("a") || cadena2.substring(i,(i+1)).equals("e") ||
         cadena2.substring(i,(i+1)).equals("i") ||
          cadena2.substring(i,(i+1)).equals("o") || cadena2.substring(i,(i+1)).equals("u")){
             System.out.println("\tvocal " + vocales++ + " :" + cadena2.substring(i,(i+1)));}  i++;
      }
      if(vocales == 1){System.out.println("\t\"" + "ninguna vocal detectada en la segunda cadena" + "\"");}
    }
   
   public int getTotalVocalesCadena1(){return vocales;}
   
   public int getI(){return i;}
   
   public String getVocalesCadena1(){return cadena2;}
}

 algo de lo bastante  que aprendí mejorando este código es que el hecho de que un código compile y cumpla su cometido, no define exactamente el buen diseño del código y que debemos optar por un buen diseño.
Salu2!
while(estesVivo)
{
  aprende();
  ayuda();
  enseña();
}
if(mueres){teRecordaran();}

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:Ejercicio! entrega CU00662B
« Respuesta #3 en: 15 de Julio 2014, 09:46 »
Hola, como bien dices aprender java requiere de perseverancia y esfuerzo. El código se ve mucho mejor estructurado - diseñado, pero todavía quedan cosas que habría que mejorar:


- Error grave de diseño: tienes dos clases denominadas AnalizadorVocalesCadena1 y AnalizadorVocalesCadena2 que prácticamente tienen el mismo código. Esto no es correcto. El código no puede repetirse en distintos lugares, el código debe ser único (no repetición - evitar duplicidades). Por tanto estas dos clases deben fusionarse en una sola clase donde en vez de un atributo cadena1 y cadena2 simplemente tengas un atributo cadena y en vez de referirte a cadena1 y cadena2 simplemente te refieras a la cadena. Luego crearás dos objetos si te hace falta, uno para cadena1 y otro para cadena2. O más objetos si tuvieras más cadenas. Creas tantos objetos como sean necesarios, pero nunca duplicas el código de una clase.

-manejadorDeEntradas quizás es preferible que sea una clase independiente que un método

-En la clase con el main elimina métodos como comparandoCaracteres que sólo tienen dos líneas. Un método sería adecuado si vamos a agrupar algo  unitario y agrupamos diez, veinte o treinta líneas, pero para dos líneas simplemente escribe el código dentro del método main.

- De la misma manera que no podemos duplicar el código de las clases no podemos duplicar el código de los métodos, por tanto no puede haber un método vocales1 y otro método vocales2 ni getEntrada1 y getEntrada2 etc.


La clase EntradaPorTeclado parece correcta.

En la clase ComparadorDeCaracteres tienes un método que se llama comparando. Ese nombre de método no es correcto. El nombre debe ser de tipo comparaCaracterACaracter, o comparaPalabras ó comparaLetraALetra... algo que describa lo que hace el método. comparando es demasiado confuso, no describe lo que hace el método. Por ejemplo en la clase AnalizadorDeCaracteresSobrantes el nombre de método extractorDeCaracteresSobrantes está perfecto.

En la clase DetectorDeCadenaMasLarga hay otro nombre de método que no es adecuado: detectando(), por el mismo motivo.

Hay diversas mejoras que conviene realizar, pero en lo que es el diseño el cambio respecto al código anterior ha sido notable, lo que indica que vas asimilando cómo se trabaja en programación orientada a objetos.

Saludos
Responsable de departamento de producción aprenderaprogramar.com

Jorge lopez

  • Sniper
  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 248
  • @SniperOfElite
    • Ver Perfil
código replanteado CU00662B
« Respuesta #4 en: 24 de Julio 2014, 21:31 »
 como ya hubiese yo dicho: aprenderJava = "no es sencillo";  aunque si se cumple la siguiente sintaxis, entonces la cosa seria un poco diferente:

 if(Moderador.equals(CésarKrall) || Moderador.equals
(CualquierOtroDeLosModeradoresDeAprenderAProgramarEnGeneral))
{aprenderJava = "mas sencillo XD";}

Aquí les dejo mi versión 1.3 del ejercicio CU00662B con mejoras basadas en comentarios hechos por CésarKrall (Moderador)

public class EntradaPorTeclado
Código: [Seleccionar]
//Esta clase recibe una entrada de teclado y almacena lo escrito en la variable de tipo String entrada.
 import java.util.Scanner;
public class EntradaPorTeclado
{
  private String entrada;
  public EntradaPorTeclado()
  {
    entrada = "";
    setEntrada();
  }
   
  public void setEntrada()
  {
    Scanner escaner = new Scanner(System.in);
    entrada = escaner.nextLine();
  }
   
  public String getEntrada(){return entrada;}
 
}
public class RectificadorDeEntradaPorTeclado
Código: [Seleccionar]
/*Esta clase resive una entrada de teclado y almacena lo escrito en la variable de tipo String entradaRectificada, siempre que no se indique una cadena vacía (""),
  si no se escribe nada, lo que equivale a una cadena vacía ("") se pedirá rectificar lo escrito mientras se escriba una cadena con caracteres*/
 import java.util.Scanner;
public class RectificadorDeEntradaPorTeclado
{
    private int vacio ;
    private String entradaRectificada;
 
    public RectificadorDeEntradaPorTeclado()
    {
        entradaRectificada = rectificarEntradaPorTeclado();
        vacio = entradaRectificada.length();     
    }
   
    public String rectificarEntradaPorTeclado()
    {
      Scanner escaner = new Scanner(System.in);
      entradaRectificada = escaner.nextLine();   
        if(entradaRectificada.length() == 0)
      {
        do{     
          System.out.println("aun no as escrito nada, por favor introduce una cadena.");
          entradaRectificada = escaner.nextLine();
          vacio = entradaRectificada.length();
        }while(vacio == 0);
      }
      else
      {
       entradaRectificada = entradaRectificada;
      }
      return getEntradaRectificada();
    }
   
    public String getEntradaRectificada(){return entradaRectificada;}
}
public class IdentificadorDeCadenaMasLarga
Código: [Seleccionar]
/*Esta clase recibe dos cadenas e identifica la cadena mas larga en caracteres, para mostrar un mensaje por pantalla indicando cual cadena excede a la otra y por cuantos
 caracteres la excede, en caso de ambas ser de igual longitud, también lo indica en un mensaje por pantalla*/
public class IdentificadorDeCadenaMasLarga
{
   private String cadena1, cadena2;
   private int cadenasConIgualLongitud, cadenaMasLarga, cadenaMasCorta;

   public IdentificadorDeCadenaMasLarga(String valorCadena1, String valorCadena2)
   {
       cadena1 = valorCadena1;
       cadena2 = valorCadena2;
       cadenaMasLarga = 0;
       cadenaMasCorta = 0;
       cadenasConIgualLongitud = 0;
       if(cadena1.length() == cadena2.length())
       {
        cadenasConIgualLongitud = cadena1.length();
       }
       else
       {
       
       }
       
       if(cadena1.length() > cadena2.length())
       {
         cadenaMasLarga = cadena1.length();
       }
       else
       {
         cadenaMasLarga = cadena2.length();
       }
       
       if(cadena1.length() < cadena2.length())
       {
         cadenaMasCorta = cadena1.length();
       }
       else
       {
         cadenaMasCorta = cadena2.length();
       }
   }
   
   public void identificarCualCadenaExcedeALaOtra()
   {
      if(cadena1.length() == cadena2.length())
      {
        System.out.println("\nAmbas cadenas constan de " + cadenasConIgualLongitud + " caracteres.\n"); 
      }
      else if(cadena1.length() > cadena2.length())
      {
        System.out.println("La primera cadena excede por " + (cadenaMasLarga - cadenaMasCorta) +
        " caracteres a la segunda cadena.");
      }
      else if(cadena1.length() < cadena2.length())
      {
        System.out.println("La segunda cadena excede por " + (cadenaMasLarga - cadenaMasCorta) +
        " caracteres a la primera cadena.");
      }
   }
}
public class ComparadorDeCaracteres
Código: [Seleccionar]
/* Esta clase recibe dos cadenas para hacer una comparación carácter a carácter entre estas dos, y muestra por pantalla cuantos caracteres se compararon, y el resultado
 * de la comparación indicando la igualdad o desigualdad entre cada carácter y carácter comparado.*/
public class ComparadorDeCaracteres
{   private int i, cadenaMasCorta;
    private String cadena1, cadena2;
    public ComparadorDeCaracteres(String valorCadena1, String valorCadena2)
    {
      i = 0;
      cadenaMasCorta = 0;
      cadena1 = valorCadena1;
      cadena2 = valorCadena2;
      if(cadena1.length() < cadena2.length())
      {
        cadenaMasCorta = cadena1.length();
      }
      else if(cadena2.length() < cadena1.length())
      {
        cadenaMasCorta = cadena2.length(); 
      }
      else if(cadena1.length() == cadena2.length())
      {
        cadenaMasCorta = cadena1.length(); 
      }
    }
   
      public void CompararCaracterPorCaracter()
    {
      if(cadena1.length() == cadena2.length() || cadena2.length() == cadena1.length())
      {
        System.out.println("Se han comparado los " +
        cadena1.length() + " caracteres de cada cadena:");
      }     
      else if(cadena1.length() > cadena2.length())
      {
        System.out.println("\nPuesto que la primera cadena excede la longitud de la segunda cadena, solo se han comparado los " +
        cadena2.length() + " primeros caracteres de cada cadena:");
      }     
      else if(cadena2.length() > cadena1.length())
      {
        System.out.println("\nPuesto que la segunda cadena excede la longitud de la primera cadena, solo se han comparado los " +
        cadena1.length() + " primeros caracteres de cada cadena:");
      }
     
      if(cadena1.equals(cadena2))
      {
        System.out.println("\nHas escrito dos cadenas idénticas, por tanto  la comparación entre los " + cadena1.length() +
        " caracteres de cada cadena dice que SI son iguales para cada carácter por carácter comparado entre las dos cadenas.");
      } 
       else if(cadena1 != cadena2)
      {
        do
        {
          if(cadena1.substring(i,i+1).equals(cadena2.substring(i,i+1)))
          {
           System.out.println("\nEs el caracter " + (i+1) + " igual en las dos cadenas? SI");
          }
          else
          {
           System.out.println("\nEs el caracter " + (i+1) + " igual en las dos cadenas? NO");
          }
           System.out.println("\b" + cadena1.substring(i,i+1) + " " + cadena2.substring(i,i+1)); i++;
         }    while((i+1) < cadenaMasCorta + 1);
      }
    }
}
public class AnalizadorDeCaracteresSobrantes
Código: [Seleccionar]
//Esta clase recibe dos cadenas, analiza los caracteres sobrantes de la cadena mas larga en comparación con la cadena mas corta, los extrae y los muestra en un mensaje por pantalla.
public class AnalizadorDeCaracteresSobrantes
{
    private int i;
    private String cadena1, cadena2;
    public AnalizadorDeCaracteresSobrantes(String valorCadena1, String valorCadena2)
    {
       i = 0;
       cadena1 = valorCadena1;
       cadena2 = valorCadena2;
    }
   
    public void ExtractorDeCaracteresSobrantes()
    {
       if(cadena1.length() > cadena2.length())
       {
         do
         {
           System.out.println("\bCaracter " + (cadena2.length() + (i+1)) + ": " + cadena1.substring(cadena2.length() + i, cadena2.length() + (i+1))); i++;
         }
         while((cadena2.length() + (i+1)) < cadena1.length() + 1);
       }
       else if(cadena1.length() < cadena2.length())
       {
         do
         {
           System.out.println("\bCaracter " + (cadena1.length() + (i+1)) + ": " + cadena2.substring(cadena1.length() + i, cadena1.length() + (i+1))); i++;
         }
         while((cadena1.length() + (i+1)) < cadena2.length() + 1);
       }
    }
}
public class AnalizadorDeVocales
Código: [Seleccionar]
/*Esta clase recibe una cadena, analiza las vocales existentes en esta, las extrae y las muestra en un mensaje por pantalla, en caso de la cadena no tener ninguna vocal, también
 lo indica en un mensaje por pantalla.*/
public class AnalizadorDeVocales
{
    private String cadena;
    private int i, vocal;
    public AnalizadorDeVocales(String valorCadena)
    {
       cadena = valorCadena;
       i = 0;
       vocal = 1;
    }


    public void extractorDeVocales()
    {
       while( i < cadena.length())
       {
          if(cadena.substring(i,(i+1)).equals("a") || cadena.substring(i,(i+1)).equals("e") || 
             cadena.substring(i,(i+1)).equals("i") || cadena.substring(i,(i+1)).equals("o") ||   
             cadena.substring(i,(i+1)).equals("u") || cadena.substring(i,(i+1)).equals("A") ||
             cadena.substring(i,(i+1)).equals("E") || cadena.substring(i,(i+1)).equals("I") ||
             cadena.substring(i,(i+1)).equals("O") || cadena.substring(i,(i+1)).equals("U"))
         {
          System.out.println("\bVocal " + vocal++ + ": " + cadena.substring(i,(i+1)));
         }   i++;
       }
       
       if(vocal++ == 1)
       {
         System.out.println("\bno se han detectado vocales en esta cadena.");
       }
    }
}
public class ComparadorDeCadenas (clase con método main)
Código: [Seleccionar]
// Esta clase con el método main, usa otras clases para recibir dos cadenas y mostrar por pantalla el resultado de la comparación entre estas dos cadenas.
public class ComparadorDeCadenas //clase con método main
{
   //nada que declarar.
   public ComparadorDeCadenas()
   {
     //nada que declarar.
   }

   public static void main(String []args)
   {
      String  entrada1 = "", entrada2 = "", volver = "";
      System.out.println
      ("\bHola\nvamos a hacer una comparación carácter por carácter entre dos cadenas, para así determinar la igualdad o desigualdad entre sus caracteres.\n");
      do
      {
        System.out.println("Por favor introduce la primera cadena");
        entrada1 = entradaDeTeclado();
        if(entrada1.length() == 0)
        {
          System.out.println("Disculpa, pero no as escrito nada, por favor introduce la primera cadena.");       
          entrada1 = rectificadorDeEntradaDeTeclado(); 
        }
        System.out.println("ahora introduce la segunda cadena ");
        entrada2 = entradaDeTeclado();
        if(entrada2.length() == 0)
        {
          System.out.println("Disculpa, pero no as escrito nada, por favor introduce la segunda cadena.");       
          entrada2 = rectificadorDeEntradaDeTeclado(); 
        }
        System.out.println("\n\b\fResultados:\nPrimera cadena: " + entrada1 + "\nSegunda cadena: " + entrada2 + "\n");
        IdentificadorDeCadenaMasLarga entradaExcedente = new IdentificadorDeCadenaMasLarga(entrada1, entrada2);
        entradaExcedente.identificarCualCadenaExcedeALaOtra();
     
        ComparadorDeCaracteres comparar = new ComparadorDeCaracteres(entrada1, entrada2);
        comparar.CompararCaracterPorCaracter();
        if(entrada1.length() > entrada2.length())
        {
          System.out.println("\nEstos son los caracteres sobrantes de la primera cadena: ");
        }
        else if(entrada2.length() > entrada1.length())
        {
          System.out.println("\nEstos son los caracteres sobrantes de la segunda cadena: ");
        }
        AnalizadorDeCaracteresSobrantes caracteresSobrantes = new AnalizadorDeCaracteresSobrantes(entrada1, entrada2);
        caracteresSobrantes.ExtractorDeCaracteresSobrantes();
        System.out.println("\nEstas son las vocales detectadas en la primera cadena, enumeradas por orden de aparición:");
        AnalizadorDeVocales vocalesEntrada1 = new AnalizadorDeVocales(entrada1);
        vocalesEntrada1.extractorDeVocales();
        System.out.println("\nEstas son las vocales detectadas en la segunda cadena, enumeradas por orden de aparición:");
        AnalizadorDeVocales vocalesEntrada2 = new AnalizadorDeVocales(entrada2);
        vocalesEntrada2.extractorDeVocales();
        System.out.println("\nNota: (Esta comparación diferencia MAYÚSCULAS de minúsculas)\nSi deseas volver a comparar dos cadenas escribe \"" +
        "si\" o simplemente presiona enter para finalizar.\n");
        volver = entradaDeTeclado();
      }while(volver.equals("si") || volver.equals("Si") || volver.equals("SI") || volver.equals("sI"));
      System.out.println("Gracias por comparar cadenas\nhasta luego! ");
   }
   /*estos métodos son de pocas lineas, pero al utilizarlos con frecuencia preferí hacerlos independientes y no escribirlos cada vez directamente en el método main.*/
   
   //método entradaDeTeclado(); crea una entrada de teclado para que el usuario escriba lo que desee o necesite escribir, y almacena lo escrito en la variable String entrada.
   private static String entradaDeTeclado()
   {
      EntradaPorTeclado entrada = new EntradaPorTeclado();
      return entrada.getEntrada();
   }
   /**/
   //metodo rectificadorDeEntradaDeTeclado(); supervisa que la entradaDeTeclado(); no sea una cadena vacía ("") y de ser así deniega la acción dando la opción de volver a escribir.
   private static String rectificadorDeEntradaDeTeclado()
   {
      RectificadorDeEntradaPorTeclado rectificar = new RectificadorDeEntradaPorTeclado();
      return rectificar.getEntradaRectificada();
   }

}

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

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:Ejercicio! entrega CU00662B
« Respuesta #5 en: 26 de Julio 2014, 23:48 »
Gracias por tus comentarios hacia los moderadores Sniper, se agradecen...

Sobre el código simplemente comentarte que se ve un gran trabajo y una positiva evolución. Diría que ya pocas mejoras habría que realizar, aunque con ánimo de mejorar te voy a hacer algunos comentarios:


Habría que mejorar la ortografía: ¿no as escrito nada sin hache? Mejor no has escrito nada! Siempre has, hacer, hecho, hiciste, etc. van con hache! Esto no tiene que ver con la programación pero ;)

Las mejoras que serían recomendables en el código:

Una EntradaPorTeclado es normal que almacene información sobre una entrada de teclado, puesto que representa una entrada de teclado. Sin embargo, nos podemos preguntar, ¿es necesario que AnalizadorDeCaracteresSobrantes almacene información?

La respuesta es que depende de cómo se enfoque la solución al problema. Si tú consideras que es útil saber las cadenas con las que trabaja el AnalizadorDeCaracteresSobrantes, en ese caso sí puede ser útil que se registre esa información como atributos de la clase. Pero si consideras que te da igual las cadenas y que tú sólo necesitas "el resultado" entonces se puede prescindir de los atributos (y en este caso, llegar incluso a que la clase no tenga atributos). Lo más normal es que una clase tenga atributos y métodos, pero en algunas clases podemos prescindir de atributos y hacer que trabajen exclusivamente en base a información recibida a través de argumentos de métodos (parámetros).

En este caso en vez de tener los atributos private String cadena1, cadena2; eliminaríamos estos atributos (con lo cual tampoco habría que inicializarlos en el constructor) y lo que haríamos sería recibir la información al invocar los métodos, por ejemplo: public void ExtractorDeCaracteresSobrantes(String valorCadena1, String valorCadena2)

Nos podemos preguntar ¿Cuándo una clase debe carecer de atributos? La respuesta es que siempre que la tarea principal de la clase sea realizar operaciones sobre información que le venga de fuera y que no es necesario almacenar en la propia clase.

De acuerdo con esta lógica, habría que plantearse el eliminar los atributos cadena1, cadena2 en las siguientes clases:

IdentificadorDeCadenaMasLarga, ComparadorDeCaracteres, AnalizadorDeCaracteresSobrantes


En la clase AnalizadorDeVocales posiblemente también podrías prescindir de atributos: la clase se encarga de recibir una cadena y devolver un resultado, no es necesario que almacene la información sobre la cadena.

Sobre la clase ComparadorDeCadenas se ve una clase bien construida: dirige el programa, crea los objetos y hace que se comuniquen entre ellos. Bien hecho!

Saludos
Responsable de departamento de producción aprenderaprogramar.com

Jorge lopez

  • Sniper
  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 248
  • @SniperOfElite
    • Ver Perfil
Re:Ejercicio! entrega CU00662B
« Respuesta #6 en: 29 de Julio 2014, 16:25 »

Mi mala ortografía es producto de largas conversaciones por whatsapp, twitter, bbm, ect. (redes sociales) donde algunas personas desarrollamos un mal abito de solo escribir sin importar lo escrito mientras se entienda.

La verdad esto me avergüenza, pero acepto la critica como constructiva  ;).

En cuanto al código, he captado la idea de tu comentario con relación a considerar si declarar una variable o no declararla (tampoco inicializarlas ) en una clase basándome en cómo se enfoque la solución al problema. He realizado cambios en el código apoyándome en esta ideología y el código sigue funcionando a la perfección.

Muchísimas gracias por el comentario Cesar.
Salu2!
while(estesVivo)
{
  aprende();
  ayuda();
  enseña();
}
if(mueres){teRecordaran();}

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:Ejercicio! entrega CU00662B
« Respuesta #7 en: 29 de Julio 2014, 23:41 »
Tampoco creo que sea para avergonzarse, tómatelo con filosofía y como bien dices como algo constructivo. Muy buena esa imagen del oso-monstruo  :o :o :o :o y ánimo con la programación!

Responsable de departamento de producción aprenderaprogramar.com

 

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".