java

Traductor código Morse en Java

En este post te mostraré cómo traducir o codificar y decodificar código Morse en Java. Es decir, usar Java para programar un software que traduce de Morse a letras, y de letras a Morse. O de español a Morse, y de Morse a español, como quieras llamarle.

Traductor Morse en Java

Equivalencias de Morse a letras

Lo primero que tenemos que hacer es tener las equivalencias de manera accesible para poder buscar ya sea de Morse a ASCII o de ASCII a Morse.

La lista de equivalencias es como se ve a continuación:

Signo,Código
A,.-
B,-...
C,-.-.
CH,----
D,-..
E,.
F,..-.
G,--.
H,....
I,..
J,.---
K,-.-
L,.-..
M,--
N,-.
Ñ,--.--
O,---
P,.--.
Q,--.-
R,.-.
S,...
T,-
U,..-
V,...-
W,.--
X,-..-
Y,-.--
Z,--..
0,-----
1,.----
2,..---
3,...--
4,....-
5,.....
6,-....
7,--...
8,---..
9,----.
.,.-.-.-
",",--..--
:,---...
?,..--..
',.----.
-,-....-
/,-..-.
comilla doble,.-..-.
@,.--.-.
=,-...-
!,−.−.−−

Dentro del lenguaje, a diferencia de cuando programé esto mismo en C, utilizo un Hashtable que no es más que un diccionario de clave y valor.

public static Hashtable<String, String> obtenerEquivalencias() {
    Hashtable<String, String> equivalencias = new Hashtable<>();
    equivalencias.put("A", ".-");
    equivalencias.put("B", "-...");
    equivalencias.put("C", "-.-.");
    equivalencias.put("CH", "----");
    equivalencias.put("D", "-..");
    equivalencias.put("E", ".");
    equivalencias.put("F", "..-.");
    equivalencias.put("G", "--.");
    equivalencias.put("H", "....");
    equivalencias.put("I", "..");
    equivalencias.put("J", ".---");
    equivalencias.put("K", "-.-");
    equivalencias.put("L", ".-..");
    equivalencias.put("M", "--");
    equivalencias.put("N", "-.");
    equivalencias.put("Ñ", "--.--");
    equivalencias.put("O", "---");
    equivalencias.put("P", ".--.");
    equivalencias.put("Q", "--.-");
    equivalencias.put("R", ".-.");
    equivalencias.put("S", "...");
    equivalencias.put("T", "-");
    equivalencias.put("U", "..-");
    equivalencias.put("V", "...-");
    equivalencias.put("W", ".--");
    equivalencias.put("X", "-..-");
    equivalencias.put("Y", "-.--");
    equivalencias.put("Z", "--..");
    equivalencias.put("0", "-----");
    equivalencias.put("1", ".----");
    equivalencias.put("2", "..---");
    equivalencias.put("3", "...--");
    equivalencias.put("4", "....-");
    equivalencias.put("5", ".....");
    equivalencias.put("6", "-....");
    equivalencias.put("7", "--...");
    equivalencias.put("8", "---..");
    equivalencias.put("9", "----.");
    equivalencias.put(".", ".-.-.-");
    equivalencias.put(",", "--..--");
    equivalencias.put(":", "---...");
    equivalencias.put("?", "..--..");
    equivalencias.put("'", ".----.");
    equivalencias.put("-", "-....-");
    equivalencias.put("/", "-..-.");
    equivalencias.put("\"", ".-..-.");
    equivalencias.put("@", ".--.-.");
    equivalencias.put("=", "-...-");
    equivalencias.put("!", "−.−.−−");
    return equivalencias;
}

De este modo, para obtener el Morse de una letra simplemente se obtiene el valor a partir de la clave, dentro del diccionario, en un tiempo óptimo.

Ya para el caso de tener el Morse y buscar la letra para el traductor de Morse en Java, tendremos que hacer una búsqueda secuencial pero que no nos quita nada porque en el peor de los casos igual lo habríamos hecho con un arreglo.

Aunque, si quieres algo óptimo en tiempo de ejecución, puedes crear otro Hashtable con las claves de Morse y los valores de las letras, así sería totalmente óptimo al buscar la equivalencia.

Buscar equivalencias dentro de Hashtable

Ahora veamos los métodos de Java que nos permitirán:

  • Obtener el equivalente a Morse a partir de una letra
  • Obtener la letra a la que corresponde un código Morse (o como se le diga)

Los mismos están listados a continuación:

public static String asciiAMorse(String ascii) {
    Hashtable<String, String> equivalencias = obtenerEquivalencias();
    return equivalencias.getOrDefault(ascii, "");
}

public static String morseAAscii(String morseBuscado) {
    Hashtable<String, String> equivalencias = obtenerEquivalencias();
    Set<String> claves = equivalencias.keySet();
    // La clave es la letra ASCII
    for (String clave : claves) {
        String morse = equivalencias.get(clave);
        if (morse.equals(morseBuscado)) {
            return clave;
        }
    }
    return "";
}

En el primer caso simplemente obtenemos el valor del diccionario, a través de la clave. En el segundo caso, recorremos todo el diccionario clave por clave. Si al obtener el valor (código Morse) equivale a lo que buscamos, regresamos la clave (letra).

Si te fijas esto solo devuelve la equivalencia, pero todavía no convierte. Eso lo veremos a continuación.

Traductor Morse

Ahora veremos cómo transformar toda una cadena de Morse a letras, y de letras a Morse. Esto es, codificar a Morse y decodificar desde Morse.

public static String codificarMorse(String original) {
    StringBuilder codificado = new StringBuilder();
    for (int i = 0; i < original.length(); i++) {
        String charComoCadenaYEnMayusculas = String.valueOf(original.charAt(i)).toUpperCase();
        String equivalencia = asciiAMorse(charComoCadenaYEnMayusculas);
        codificado
                .append(equivalencia)
                .append(" ");
    }
    return codificado.toString();
}

public static String decodificarMorse(String codificado) {
    StringBuilder decodificado = new StringBuilder();
    // Necesitamos separarlo por espacios
    String[] morse = codificado.split(" ");
    for (String morseActual : morse) {
        String equivalencia = morseAAscii(morseActual);
        decodificado.append(equivalencia);
    }
    return decodificado.toString();
}

Ahora las funciones sí decodifican y codifican. Para codificar a morse lo que se hace es recorrer toda la cadena y por cada letra, buscar su equivalente. Luego ese equivalente se agrega a la cadena que tiene el resultado.

Por otro lado, para decodificar de Morse, primero se convierte la cadena a arreglo pues se debe separar por espacios. Una vez hecho esto, se recorre cada cadena del arreglo (que serán letras pero en Morse), se busca la equivalencia y se concatena.

Finalmente quiero mencionar que las letras se convierten a mayúscula porque el código no especifica soporte para letras minúsculas.

Poniendo todo junto

El código completo del traductor de Morse en Java queda como se ve a continuación. Ya incluye, dentro del método main, la manera de invocar a las funciones. Recuerda que este es un ejemplo simple; tú puedes modificarlo a tu gusto.

/*
  ____          _____               _ _           _
 |  _ \        |  __ \             (_) |         | |
 | |_) |_   _  | |__) |_ _ _ __ _____| |__  _   _| |_ ___
 |  _ <| | | | |  ___/ _` | '__|_  / | '_ \| | | | __/ _ \
 | |_) | |_| | | |  | (_| | |   / /| | |_) | |_| | ||  __/
 |____/ \__, | |_|   \__,_|_|  /___|_|_.__/ \__, |\__\___|
         __/ |                               __/ |
        |___/                               |___/

____________________________________
/ Si necesitas ayuda, contáctame en \
\ https://parzibyte.me               /
 ------------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
Creado por Parzibyte (https://parzibyte.me). Este encabezado debe mantenerse intacto,
excepto si este es un proyecto de un estudiante.
* */package me.parzibyte;


import java.util.Hashtable;
import java.util.Scanner;
import java.util.Set;

public class Main {
    public static Hashtable<String, String> obtenerEquivalencias() {
        Hashtable<String, String> equivalencias = new Hashtable<>();
        equivalencias.put("A", ".-");
        equivalencias.put("B", "-...");
        equivalencias.put("C", "-.-.");
        equivalencias.put("CH", "----");
        equivalencias.put("D", "-..");
        equivalencias.put("E", ".");
        equivalencias.put("F", "..-.");
        equivalencias.put("G", "--.");
        equivalencias.put("H", "....");
        equivalencias.put("I", "..");
        equivalencias.put("J", ".---");
        equivalencias.put("K", "-.-");
        equivalencias.put("L", ".-..");
        equivalencias.put("M", "--");
        equivalencias.put("N", "-.");
        equivalencias.put("Ñ", "--.--");
        equivalencias.put("O", "---");
        equivalencias.put("P", ".--.");
        equivalencias.put("Q", "--.-");
        equivalencias.put("R", ".-.");
        equivalencias.put("S", "...");
        equivalencias.put("T", "-");
        equivalencias.put("U", "..-");
        equivalencias.put("V", "...-");
        equivalencias.put("W", ".--");
        equivalencias.put("X", "-..-");
        equivalencias.put("Y", "-.--");
        equivalencias.put("Z", "--..");
        equivalencias.put("0", "-----");
        equivalencias.put("1", ".----");
        equivalencias.put("2", "..---");
        equivalencias.put("3", "...--");
        equivalencias.put("4", "....-");
        equivalencias.put("5", ".....");
        equivalencias.put("6", "-....");
        equivalencias.put("7", "--...");
        equivalencias.put("8", "---..");
        equivalencias.put("9", "----.");
        equivalencias.put(".", ".-.-.-");
        equivalencias.put(",", "--..--");
        equivalencias.put(":", "---...");
        equivalencias.put("?", "..--..");
        equivalencias.put("'", ".----.");
        equivalencias.put("-", "-....-");
        equivalencias.put("/", "-..-.");
        equivalencias.put("\"", ".-..-.");
        equivalencias.put("@", ".--.-.");
        equivalencias.put("=", "-...-");
        equivalencias.put("!", "−.−.−−");
        return equivalencias;
    }

    public static String asciiAMorse(String ascii) {
        Hashtable<String, String> equivalencias = obtenerEquivalencias();
        return equivalencias.getOrDefault(ascii, "");
    }

    public static String morseAAscii(String morseBuscado) {
        Hashtable<String, String> equivalencias = obtenerEquivalencias();
        Set<String> claves = equivalencias.keySet();
        // La clave es la letra ASCII
        for (String clave : claves) {
            String morse = equivalencias.get(clave);
            if (morse.equals(morseBuscado)) {
                return clave;
            }
        }
        return "";
    }

    public static String codificarMorse(String original) {
        StringBuilder codificado = new StringBuilder();
        for (int i = 0; i < original.length(); i++) {
            String charComoCadenaYEnMayusculas = String.valueOf(original.charAt(i)).toUpperCase();
            String equivalencia = asciiAMorse(charComoCadenaYEnMayusculas);
            codificado
                    .append(equivalencia)
                    .append(" ");
        }
        return codificado.toString();
    }

    public static String decodificarMorse(String codificado) {
        StringBuilder decodificado = new StringBuilder();
        // Necesitamos separarlo por espacios
        String[] morse = codificado.split(" ");
        for (String morseActual : morse) {
            String equivalencia = morseAAscii(morseActual);
            decodificado.append(equivalencia);
        }
        return decodificado.toString();
    }

    public static void main(String[] args) {
        String original = "parzibyte.me";
        System.out.println(codificarMorse(original));
        String codificado = ".--. .- .-. --.. .. -... -.-- - . .-.-.- -- .";
        System.out.println(decodificarMorse(codificado));
        Scanner sc = new Scanner(System.in);
        System.out.println("Ingresa un texto y lo convertiré a Morse: ");
        String textoDeUsuario = sc.nextLine();
        codificado = codificarMorse(textoDeUsuario);
        System.out.println("El texto convertido es: ");
        System.out.println(codificado);
    }

}

También puedes ver más tutoriales sobre Java en mi blog.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

3 días hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

3 días hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

3 días hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

3 días hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

3 días hace

Solución: Apache – Server unable to read htaccess file

Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…

4 días hace

Esta web usa cookies.