Foros aprenderaprogramar.com

Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: felipevega en 28 de Abril 2021, 18:51

Título: Java método equals Cómo se puede diferenciar entre igualdad e identidad CU00662B
Publicado por: felipevega en 28 de Abril 2021, 18:51
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

 
Título: Re: Java método equals Cómo se puede diferenciar entre igualdad e identidad CU00662B
Publicado por: Mario R. Rancel en 29 de Abril 2021, 20:19
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
Título: Re: Java método equals Cómo se puede diferenciar entre igualdad e identidad CU00662B
Publicado por: felipevega en 30 de Abril 2021, 00:16
Muchas gracias por tu respuesta Mario, la idea es ir cada vez mejorando y simplificando el código  ;D
Título: Re: Java método equals Cómo se puede diferenciar entre igualdad e identidad CU00662B
Publicado por: Kabuto en 30 de Abril 2021, 20:31
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.  ;)
Título: Re: Java método equals Cómo se puede diferenciar entre igualdad e identidad CU00662B
Publicado por: Mario R. Rancel en 30 de Abril 2021, 21:47
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.
Título: Re: Java método equals Cómo se puede diferenciar entre igualdad e identidad CU00662B
Publicado por: felipevega en 06 de Mayo 2021, 01:49
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
Título: Re: Java método equals Cómo se puede diferenciar entre igualdad e identidad CU00662B
Publicado por: Mario R. Rancel en 06 de Mayo 2021, 21:10
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
Título: Re: Java método equals Cómo se puede diferenciar entre igualdad e identidad CU00662B
Publicado por: felipevega en 06 de Mayo 2021, 21:53
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.