Autor Tema: Java método equals Cómo se puede diferenciar entre igualdad e identidad CU00662B  (Leído 2240 veces)

felipevega

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 6
    • Ver Perfil
Buenos días compañeros,

Adjunto el ejercicio resuelto para el tema El método equals en Java. Diferencia entre igualdad e identidad. Comparar objetos. Ejemplos. (CU00662B) del curso de programación Java desde cero.

No sé la verdad si se debía desarrollar como el ejemplo del tema Pensar en objetos. Una entrada de teclado o consola en Java como objeto con campos y métodos. (CU00661B)

Muchas gracias por su retroalimentación

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

public class CompararLetras{

    public static void main (String [] args){

        String texto1 = "";
        String texto2 = "";
        boolean vble = false;

        System.out.println("Digite el primer texto: ");
        Scanner valorScanner = new Scanner(System.in);
        texto1 = valorScanner.nextLine();
        System.out.println("Digite el segundo texto: ");
        Scanner valor2Scanner = new Scanner(System.in);
        texto2 = valorScanner.nextLine();

        if (texto1.length() == texto2.length()){
            for (int i = 0 ; i < texto1.length() ; i++){
                if( texto1.substring(i,i+1).equals(texto2.substring(i,i+1)) ){
                    vble = true;
                    System.out.println("¿La letra " + i + " igual en las 2 palabras? " + vble);
                }else {
                    vble = false;
                    System.out.println("¿La letra " + i + " igual en las 2 palabras? " + vble);
                }
            }

        }else if ( texto1.length() > texto2.length() ){
            int dif = texto1.length() - texto2.length();
            int cont = 0;
            for (int i = 0 ; i < texto2.length() ; i ++){
                if( texto1.substring(i,i+1).equals(texto2.substring(i,i+1)) ){
                    vble = true;
                    System.out.println("¿La letra " + i + " igual en las 2 palabras? " + vble);
                }else {
                    vble = false;
                    System.out.println("¿La letra " + i + " igual en las 2 palabras? " + vble);
                }
                cont = cont + 1;
            }

            for (int i = 0 ; i < dif ; i ++){
                System.out.println("¿La letra " + cont + " igual en las 2 palabras? " + "La palabra 2 no tiene letra " + cont );
                cont = cont + 1;
            }

        }else {
            int dif = texto2.length() - texto1.length();
            int cont = 0;
            for (int i = 0 ; i < texto1.length() ; i ++){
                if( texto1.substring(i,i+1).equals(texto2.substring(i,i+1)) ){
                    vble = true;
                    System.out.println("¿La letra " + i + " igual en las 2 palabras? " + vble);
                }else {
                    vble = false;
                    System.out.println("¿La letra " + i + " igual en las 2 palabras? " + vble);
                }
                cont = cont + 1;
            }
           
            for (int i = 0 ; i < dif ; i ++){
                System.out.println("¿La letra " + cont + " igual en las 2 palabras? " + "La palabra 1 no tiene letra " + cont );
                cont = cont + 1;
            }

        }

    }//cierre main
}//cierre clase

 
« Última modificación: 29 de Abril 2021, 20:19 por Mario R. Rancel »

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Hola Felipe, tu código funciona correctamente. Te hago algunas sugerencias de mejora:

- Una cosa es los índices que usemos nosotros como programadores (0, 1, 2, 3 ...) y otra la forma de contar habitual en la vida normal o día a día (1, 2, 3, ...) por ello en el resultado que ofrece el programa al usuario parece que sería más fácil para el usuario si en lugar de mostrando ¿La letra 0 igual en las 2 palabras? empezaras mostrando ¿La letra 0 igual en las 2 palabras? Esto no te obliga a cambiar índices, se puede resolver de forma fácil sumando 1 en el momento de mostrar la salida por pantalla.

- En tu código se ve un cierto grado de repetición de instrucciones. La repetición no es deseable en programación porque resulta ineficiente y a la larga genera problemas para mantener los programas. Consulta otras soluciones en los foros (por ejemplo https://aprenderaprogramar.com/foros/index.php?topic=2089.0) que muestran soluciones más compactas, con menos código y menos repeticiones, e inténtalo por tí mismo.

Respecto a lo que comentas sobre <<No sé la verdad si se debía desarrollar como el ejemplo del tema Pensar en objetos. Una entrada de teclado o consola en Java como objeto con campos y métodos.>> te puedo decir lo siguiente: en Java en general siempre debes pensar en objetos y trabajar utilizando diferentes clases que representen los elementos de tu modelo. En este ejercicio no se decía nada al respecto y es un ejercicio sencillo, por tanto crear alguna clase auxiliar no es obligatorio para este ejercicio, aunque si se quiere se puede hacer para practicar. En programas reales o en ejercicios más complicados sí se hace necesario utilizar diferentes clases.

Saludos

felipevega

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 6
    • Ver Perfil
Muchas gracias por tu respuesta Mario, la idea es ir cada vez mejorando y simplificando el código  ;D

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 985
    • Ver Perfil
Otro comentario que me atrevo a añadir, es que por lo general no es necesario crear más de un Scanner para pedir diferentes datos, se puede hacer todo con uno solo.

De hecho en tu programa, a pesar de que declaras dos objetos Scanner (señalo en rojo), en realidad estás usando solo uno (señalo en verde)

Citar
Scanner valorScanner = new Scanner(System.in);
        texto1 = valorScanner.nextLine();
        System.out.println("Digite el segundo texto: ");
        Scanner valor2Scanner = new Scanner(System.in);
        texto2 = valorScanner.nextLine();

Así que la línea donde declaras el objeto valor2Scanner, la puedes borrar.

Un saludo.  ;)
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Se me había pasado eso... Otro detalle para que te apuntes Felipe, ya que muchas veces quedan fragmentos de código "muerto" dentro de nuestro código y esto se debe tratar de evitar.

felipevega

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 6
    • Ver Perfil
Bueno compañeros, luego de las correcciones que me han realizado e investigando un poco mas del manejo de los objetos y el main, reescribí el código para optimizarlo.

Por favor me informan como lo ven.

Clase CapturaTeclado
Código: [Seleccionar]
import java.util.Scanner;

public class CapturaTeclado{

    private Scanner lector;
   
    //constructor
    public CapturaTeclado(){
        lector = new Scanner(System.in);
    }
   
    //Metodo mesaje de bienvenida
        public void mostrarMensajeInicio(){
        System.out.println("**********************");
        System.out.println("* Inicio de programa *");
        System.out.println("**********************");
    }
   
    //Metodo saber si es el texto 1 o 2
    public String capturaTexto(boolean isTextoUno){
        String mensaje;
        String texto;
        if (isTextoUno){
            mensaje = "Digite el primer texto";
        }else {
            mensaje = "Digite el segundo texto";
        }
        System.out.println(mensaje);
        texto = lector.nextLine();
        return texto;
    }

}//.cierre clase


Clase Procesador Texto
Código: [Seleccionar]
public class ProcesadorTexto{

    //constructor
    public ProcesadorTexto(){}

    public void compararLetras(String textoUno, String textoDos){
        int mayor, menor, palabraMenor;
        boolean vble;

        if(textoUno.length() >= textoDos.length()){
            mayor = textoUno.length();
            menor = textoDos.length();
            palabraMenor = 2;
        }else{
            mayor = textoDos.length();
            menor = textoUno.length();
            palabraMenor = 1;
        }

        for (int i = 0 ; i < mayor ; i ++){

            if (i < menor){

                if(textoUno.charAt(i)==textoDos.charAt(i)){
                    vble = true;
                    System.out.println("¿La letra " + (i+1) + " igual en las 2 palabras? " + vble);
                }else{
                    vble = false;
                    System.out.println("¿La letra " + (i+1) + " igual en las 2 palabras? " + vble);
                }

            }else {
                System.out.println("¿La letra " + (i+1) + " igual en las 2 palabras? " + "La palabra " + palabraMenor + " no tiene letra" );
            }
        }//cierre for

    }

}//Cierre clase

Main Clase Ejecutable
Código: [Seleccionar]
public class Ejecutable{

    public static void main (String [] args){
         
    CapturaTeclado capturaTeclado = new CapturaTeclado();
    capturaTeclado.mostrarMensajeInicio();
   
    String textoUno = capturaTeclado.capturaTexto(true);
    String textoDos = capturaTeclado.capturaTexto(false);
   
    ProcesadorTexto procesadorTexto = new ProcesadorTexto();
    procesadorTexto.compararLetras(textoUno, textoDos);
   
     
   
}//cierre main

}//cierre clase

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Hola Felipe, ahora tu diseño es orientado a objetos. Has creado objetos que interaccionan entre sí, y es el main quien dirige la dinámica de la interacción. Se puede decir que "vas por buen camino". Hay cuestiones que deberás ir perfilando. Por ejemplo, una cuestión importante en el diseño orientado a objetos es definir bien las responsabilidades de cada objeto. Por ejemplo, un objeto CapturaTeclado es poco lógico que tenga entre sus funciones mostrar por pantalla "Inicio de programa", eso no sería un buen diseño. ¿Por qué? Porque un objeto de este tipo debe tener bien delimitadas sus funciones y estas ser acordes con el nombre del objeto. Una CapturaTeclado debería limitarse a representar y facilitar métodos de una captura de teclado, no a mostrar mensajes por pantalla ni otras cosas. Pero no te preocupes ahora de estas cuestiones, pues es algo que se debe ir asimilando poco a poco. A través de lectura, participación en foros, práctica, realización de ejercicios, etc. irás mejorando poco a poco.

Saludos

felipevega

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 6
    • Ver Perfil
Muchas gracias Mario por tu retroalimentación, la idea es cada vez ir aprendiendo mas y pues ir mejorando cada vez el diseño de los diferentes ejercicios.

 

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