Autor Tema: Java calcular número de letras de más que tiene palabra respecto otra CU00662B  (Leído 5892 veces)

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Buenas noches.

A continuación dejo la solución del ejercicio CU00662B del curso Java desde cero.

Citar
EJERCICIO

Crea una clase en cuyo método main ejecutes una comparación letra a letra usando equals de dos palabras usando bucles. Por ejemplo si las palabras son “avispa” y “ave” el programa debe dar como resultado: ¿Letra 1 igual en las dos palabras? True. ¿Letra 2 igual en las dos palabras? True ¿Letra 3 igual en las dos palabras? False ¿Letra 4 igual en las dos palabras? La palabra 2 no tiene letra 4 ¿Letra 5 igual en las dos palabras? La palabra 2 no tiene letra 5 ¿Letra 6 igual en las dos palabras? La palabra 2 no tiene letra 6.

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

public class CompararDosCadenas{
   
    public static void main(String []args){
        System.out.println("Introduzca la primera entrada: ");
        Scanner entradaEscaner = new Scanner(System.in);
        String entradaTeclado01;
        entradaTeclado01 = entradaEscaner.nextLine();
        System.out.println("Introduzca la segunda entrada: ");
        String entradaTeclado02;
        entradaTeclado02 = entradaEscaner.nextLine();
        int comparador01 = entradaTeclado01.length();
        if(entradaTeclado01.length()>entradaTeclado02.length()){ //Comparamos cuál de las dos entradas tiene menos carácteres
            comparador01 = entradaTeclado02.length(); //Establecemos el comparador a la entrada que tiene menos carácteres
        }
        int comparador02 = entradaTeclado01.length();
        if(entradaTeclado01.length()<entradaTeclado02.length()){ //Comparamos cuál de las dos entradas tiene más carácteres
            comparador02 = entradaTeclado02.length(); //Establecemos el comparador a la entrada que tiene más carácteres
        }
        comparador02 -= comparador01; //Calculamos la diferencia del comparador que tiene más valor menos el que tiene menos, para así saber cuantas veces tenemos que repetir la frase "La palabra no tiene esta letra"
        for(int i=0;i<comparador01;i++){
        System.out.println("¿La letra: "+(i+1)+" igual en las dos palabras?: "+entradaTeclado01.substring(i,i+1).equals(entradaTeclado02.substring(i,i+1)));
        }
        String palabraCorta = entradaTeclado01;
        if(entradaTeclado01.length() > entradaTeclado02.length()){
            palabraCorta = entradaTeclado02;
        }
        for(int j=0;j<comparador02;j++){
            System.out.println("La palabra: \""+palabraCorta+"\" no tiene letra: "+(j+comparador01+1));
        }
    } //Cierre del main
   
} //Cierre de la clase

Gracias.
« Última modificación: 05 de Marzo 2016, 20:15 por César Krall »

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Hola!

Has hecho un planteamiento creativo, distinto a la solución que suelen dar otras personas, y está bien planteado ;) Si alguien se anima se puede intentar plantear el mismo código de forma un poco más compacta.

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

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Buenas, César.

Gracias por corregir otro ejercicio más.

Me alegra que pienses eso de mi planteamiento. Es verdad, el código no es muy limpio (ordenado), pero un día llegará cuando también consiga eso, jeje.

A ver si alguien, de verdad se anima, y lo deje un poquito más "leible".

Un saludo.

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Es ciertamente un planteamiento interesante. Me encanta encontrarme cosas así porque demuestra lo variada que puede ser la programacion según cada persona. Hasta para tareas sencillas (comparar letras) nos encontramos distintas maneras, ni mejores ni peores, que llevan a lo mismo.

Os dejo la solución a la que yo he llegado, para compartir ideas.
En realidad os dejo dos, la última es exactamente igual, pero usando el método .charAt() en lugar de .subString().
Esto ya no cumple el enunciado propuesto en el ejercicio, pero lo pongo para que se vea como funciona y ver que puede ser más cómodo para cuando queramos operar con los caracteres individuales de un String.
Tan solo hay que tener en cuenta que .subString() nos devuelve una letra de tipo String y .toChar() nos devuelve también una letra, pero tipo char.
Por eso con esta última podemos usar el comparador de igualdad == y con la primera hay que recurrir al método .contains().
En según cada caso, nos interesará más usar una manera u otra.

Un saludo a todos.

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

public class ComparaCaracteres {

public static void main(String[] args) {
Scanner teclado = new Scanner(System.in);

        System.out.print("Primera palabra: ");
        String pal1 = teclado.nextLine();
        System.out.print("Segunda palabra: ");
        String pal2 = teclado.nextLine();
        teclado.close();

        //¿Cual es mayor?
        if (pal1.length() > pal2.length())
        {
            int mayor = pal1.length();
            int menor = pal2.length();
            int i;//Indice nos sirve para los dos bucles
            for (i = 0; i < menor; i++)
            {
                System.out.print("¿Letra " + (i+1) + " es igual en ambas palabras?: ");
                System.out.println(pal1.substring(i, i+1).equals(pal2.substring(i, i+1)));
            }
            for (;i < mayor; i++)//"i" conserva el valor del bucle anterior
            {
                System.out.print("¿Letra " + (i+1) + " es igual en ambas palabras?: ");
                System.out.println("La segunda palabra no tiene la letra " + (i+1));
            }
        }
        else//Segunda palabra es mayor, pero tambien nos vale en el caso de que midieran igual
        {
            int mayor = pal2.length();
            int menor = pal1.length();
            int i;
            for (i = 0; i < menor; i++)
            {
                System.out.print("¿Letra " + (i+1) + " es igual en ambas palabras?: ");
                System.out.println(pal1.substring(i, i+1).equals(pal2.substring(i, i+1)));
            }
            /*Siguiente bucle no se ejecutara si las palabras midieran igual
             * ya que entonces "i" no sera menor que "mayor" y por lo tanto
             * no se cumplirá la condicion del bucle
             */
            for (;i < mayor; i++)
            {
                System.out.print("¿Letra " + (i+1) + " es igual en ambas palabras?: ");
                System.out.println("La primera palabra no tiene la letra " + (i+1));
            }
        }
}
}



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

public class ComparaCaracteres {

public static void main(String[] args) {
Scanner teclado = new Scanner(System.in);

        System.out.print("Primera palabra: ");
        String pal1 = teclado.nextLine();
        System.out.print("Segunda palabra: ");
        String pal2 = teclado.nextLine();
        teclado.close();

        //¿Cual es mayor?
        if (pal1.length() > pal2.length())
        {
            int mayor = pal1.length();
            int menor = pal2.length();
            int i;//Indice nos sirve para los dos bucles
            for (i = 0; i < menor; i++)
            {
                System.out.print("¿Letra " + (i+1) + " es igual en ambas palabras?: ");
                System.out.println(pal1.charAt(i)==pal2.charAt(i));
            }
            for (;i < mayor; i++)//"i" conserva el valor del bucle anterior
            {
                System.out.print("¿Letra " + (i+1) + " es igual en ambas palabras?: ");
                System.out.println("La segunda palabra no tiene la letra " + (i+1));
            }
        }
        else//Segunda palabra es mayor, pero tambien nos vale en el caso de que midieran igual
        {
            int mayor = pal2.length();
            int menor = pal1.length();
            int i;
            for (i = 0; i < menor; i++)
            {
                System.out.print("¿Letra " + (i+1) + " es igual en ambas palabras?: ");
                System.out.println(pal1.charAt(i)==pal2.charAt(i));
            }
            /*Siguiente bucle no se ejecutara si las palabras midieran igual
             * ya que entonces "i" no sera menor que "mayor" y por lo tanto
             * no se cumplirá la condicion del bucle
             */
            for (;i < mayor; i++)
            {
                System.out.print("¿Letra " + (i+1) + " es igual en ambas palabras?: ");
                System.out.println("La primera palabra no tiene la letra " + (i+1));
            }
        }
}
}
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

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Buenaso días, Kabuto.

Primero, agradecerte que has constestado a la propuesto de César (y posteriormente mía) de demostrar el mundo fascinante de la programación y más concretamente que un mismo objetivo se puede conseguir mediante una infinidad de formas y métodos.

Sobre los dos códigos que has puesto, me parecen perfectos. Quiero decir, cumplen el cometido del ejercicio, y por supuesto, el/los código/s está/n escirto/s de una manera mucho más límpia que el mio. Has ordenado muy bien el código y todo se entiendo.

Varias cuestiones que me han parecido interesantes para comentar:

Primero: no sabía para que se utilizaba el método .close de la clase "Scanner". Consulté la documentación de "Java" y ví que es para cerrar el método:

Citar
close()
Closes this scanner.

Mi pregunta es: Si no ponemos esta línea, pasa algo?

Segundo: Muy interesante el planteamiento con los dos distintos métodos de la clase "String". Interpreto, de lo que he visto, que el método String.charAt() lo que devuelve es un tipo primitivo (char) y el método String.substring() devolverá un String que es un objeto un tanto especial (como se comenta en las entragas del curso).

Y para acabar esta observación: me ha parecido muy original que si las dos palabras tengan la misma longitud, no entren en ninguno de los dos bucles secundarios y así evitar que se imprimen las líneas "La primera/segunda línea no tiene la letra n".

En difinitiva, me ha gustado tu forma de solucionar el probrema.

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Hola dimiste. Gracias por tus comentarios.

Los objetos Scanner, y varios más que irás descubriendo con el tiempo, son  recomendables "cerrarlos" cuando ya no se vayan a usar más.

En programas sencillos como estos que se hacen para aprender y todo sucede dentro del metodo main, no tiene apenas importancia.

En programas mas completos puede suponer un problema a la hora de recoger datos.
Es decir, un programa más completo, tendrá una clase con el metodo main, y seguramente durante la ejecución del programa se llamaran a otras clases escritas por el programador en archivos separados, con sus correspondientes métodos, o sea, que el código estará repartido en varios sitios.

Bien, si uno de estos métodos al terminar se deja un Scanner sin cerrar, puede ocurrir que otro método con su propio Scanner tenga problemas de acceso al System.in porque el anterior Scanner no liberó los recursos que ocupaba.

Como digo, en programas así sencillos no tiene relevancia, pero conviene cerrarlos igualmente para ir tomando buenas costumbres.

Además, yo escribo el código con el editor Eclipse, y si no cierro los Scanner, me marca el código con un signo de admiración, un warning,y claro, no queda bonito que te estén llamando la atención je je.
Me deja ejecutar el programa sin problemas pero me avisa de que, ojo, hay cierto riesgo.

Sobre .subString() y .toChar(), como bien dices, cada uno devuelve un tipo de dato distinto.
Aunque a subString() le pidamos un único carácter, ese carácter será de tipo String.
Por ejemplo,  --> "c"
.toChar nos devolvería ese caracter en tipo char.
Por ejemplo  --> 'c'

Fijate que para el char he usado "comillas simples". No es lo mismo "c" que 'c'.
Para Java (y otros lenguajes como C++) distingue entre estos dos tipos de comillas.
Lo que esté entre "comillas dobles", se considera un String.
Lo que esté entre "comillas simples", se considera un char.

Esto simplemente hay que tenerlo en cuenta porque, aunque con ambos tipos de dato podremos hacer las mismas cosas (como formar palabras, recoger opciones de un menu en pantalla,...), estas cosas habrá que hacerlas de distintas maneras y con distintos métodos según el tipo con el que estemos trabajando.

Pero en fin, todo esto se va aprendiendo sobre la marcha. No hay que preocuparse mucho ahora de estos "detalles".

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

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Gracias, Kabuto, por toda la información tan valiosa que me "regalas" mediante tus aclaraciones. Ahora mismo, en este etapa de mi crecimiento como programador soy como una esponja y este tipo de información, por muy sencilla que te parezca a ti, para mi es muy valiosa. Gracias.

Desconocía totalmente lo de las dobre comillas y las simples. Estoy acostumbrado de utilizar las doble comillas (por el curso de CSS que hicimos, en esta página:)).

Para programar en JavaScript utilizo Sublime text, pero para programación en Java sigo las recomendaciones del curso y me he instalado "BlueJ". No sé si es mejor o peor, de momento me va bien.
Es verdad, no es tan sofisticado como Sublime, pero me muestra (gráficamente) donde empiezan y acaban las cosas (condicionales, bucles, etc.).

Te quería preguntar otra cuestión, si no es mucha molestía. Como puedo hacer que un proyecto hecho en Java se ejecute no sólo en la máquina virtual de Java. Quiero decir, hay alguna manera de convertir los archivos (proyectos de Java) en archivos autoejecutables (tipo extensión exe, etc.). en el sentido que cuando le pase a otra tercera persona mi programa lo pueda ejecutar en su PC sin que tenga Java instalado.

Y también, si se puede instalar (subir) una aplicaciones hecha en Java en alguna página. Verlo a través del navegador. Creo que se tiene que programar con clases "applet", pero ni sé para que se utilizan.

Sigo con el curso. Ahora mismo estoy en la entrega CU00672B, pero he mirado por encima las demás entregas que me faltan y no veo por ningún lado que se enseñe como se pueden subir proyectos en una página web. Lo mismo estoy en lo incierto.

Gracias.

PD: Tomo nota sobre que "Scanner" es un objeto y no una clase, jeje:)

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
BlueJ es genial para empezar a aprender, por cosas como poder ejecutar clases sin necesidad de llamarlas desde un main y tal, o por como representa gráficamente las conexiones y jerarquías de las clases. Es una gozada.

Pero tarde o temprano querrás saltar a entornos más profesionales como Eclipse, NetBeans, IntelliJ...  hay muchos.

Sobre crear ejecutables, seguro que alguien te lo podrá explicar mejor que yo (¡¡yo también estoy aprendiendo!!), pero en Java, por su filosfia de lenguaje "medio compilado, medio interpretado", no hay exactamente ejecutables como tal.

Se pueden crear archivos con extension .jar (que es poco más que un archivo comprimido con todas las clases que pueda necesitar nuestro programa).
Si el programa tiene interfaz gráfica se podría abrir haciendole doble click, similar a como si fuera un exe.
Si es un programa pensado para la consola de texto, como todos los que hacemos para aprender, habría que llamarlo desde la consola de comandos invocando el comando java.
Si buscar por Google poniendo "ejecutable Java" verás multitud de explicaciones sobre esto.

Tampoco le des muchas vueltas ahora a esto, entiendo que cuando empezamos a programar nos ilusiona poder hacer nuestros exe y compartirlos con otras personas. Y Java en este aspecto al principio desilusiona porque nos "tiene atados" al editor y parece que solo mediante este pueden ejecutarse, aunque obviamene no es asi.
Pero lo importante ahora es aprender a programar.
Cuando tengas más conocimientos, puedes atreverte a ir aprendiendo también C++ de manera simultánea (es muy similar a Java, casi calcado, de hecho, Java es un derivado de C++).
C++ si es un lenguaje compilado y te permitirá crear ejecutables para saciar la sed de crear archivos .exe, aunque sea de programitas tontunos de comparar palabras je je..

Por úlitmo, quizás me expresa mal con lo del objeto Scanner.

Scanner es una clase, y para poder utilizarla, tenemos que crear un objeto de esta clase.
En tu programa lo llamas entradaEscanner, yo lo llamo teclado, da igual como se llama, todos son objetos de la clase Scanner.

Es decir, las clases son como una definicion abstracta de como es una "cosa" (atributos) y qué comportamientos puede tener (Métodos). Pero la concreción de esa "cosa", la "materialización", es lo que llamaremos Objeto.

Podemos decir, que tu eres el objeto Dimiste, y yo soy el objeto Kabuto. Somos objetos diferentes, pero ambos pertenecemos a la clase Persona.

Esta clase dice que tenemos unos atributos: ojos, nariz, boca, extremidades, pelo, nº de DNI, etc.. pero la clase no especifica como han de ser, no tiene unos valores concretos.
Estos atributos se especifican, reciben unos valores concretos, cuando se crea un objeto.

Yo tengo ojos "verdes", tu quizás los tienes "marrones", yo tengo la nariz "larga", quizás la tuya sea "chata",
Mi color de pelo es "marrón", el tuyo puede ser "rubio", el de otra persona si es calva, pues será "null" je je...

Nuestra clase Persona además nos otorga unos "Métodos" unos procedimientos/funciones para realizar tareas.
Las personas respiramos, así que la clase Persona tendrá un método llamado respirar().
Así que si yo ejecuto mi metodo respirar y le paso un parametro aceptable para este metodo:
kabuto.respirar(aire);

Pues dara un resultado, en este caso, me dará unos cuantos segundos más de vida.
Si el parametro es diferente:
kabuto.respirar(veneno);

Pues el método .respirar() devolverá un resultado distinto, en este caso, mis segundos de vida se reducirán notablemente.  :P


Esto es básicamente la programacion orientada a objetos. Definir unas clases otorgándoles unos atributos y unos métodos, y a partir de ellas crearemos objetos, cada uno con los mismos atributos, pero con distintos valores según cada objeto.
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

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Gracias por la respuesta, Kabuto!!!

La verdad que tu ejemplo sobre como es la filosofía de Java me ha encantado. Concisa, breve y muy explicativa!!! En dos palabras, has podido explicar(me) que cometido tiene el lenguaje Java y como funciona.

El César Krall, en una de sus respuestas también me explicó el concepto de objetos y como funcionan sus referencias (que son unas variables que apuntan a un objeto, que no es el objeto en sí). Le agradezco a los dos los esfuerzos de explicarme la esencia de Java.

Tu ejemplo es muy bueno, porque mediante ejemplos entendibles de la vida real has podido aplicarlos a al funcionamiento de un lenguaje de programación (lo mismo que César Krall) en respondiéndome a una, de tantas, duda que tenía.

Sobre lo de "Java ejecutable", pues sí. Tengo muchas ganas de ver lo creado de mi (por ahora muy poquito) fuera de la máquina virtual de Java. Pero es lo que tú dices también, por ahora debería de tener paciencia y entender lo básico y luego ya "creceré".

Sí, pienso hacer también el curso C++. Incluso, quizás empecé por la cabeza yendo a los pies y no al revés (como debería ser :)).

Sigo adelante y con vuestra ayuda espero conseguirlo :)

Saludos.

 

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