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
-
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
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
-
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
-
Muchas gracias por tu respuesta Mario, la idea es ir cada vez mejorando y simplificando el código ;D
-
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)
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. ;)
-
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.
-
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
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
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
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
-
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
-
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.