From 542f774ceaf4ba26fa8f8fd7c11abebd6350adc7 Mon Sep 17 00:00:00 2001
From: Dennis Eisold <de@itstall.de>
Date: Mon, 25 Nov 2019 18:34:20 +0100
Subject: [PATCH] Morsecode Klasse fertig gestellt

---
 src/main/java/Enigma/model/Morsecode.java | 166 +++++++++++++++++-----
 1 file changed, 128 insertions(+), 38 deletions(-)

diff --git a/src/main/java/Enigma/model/Morsecode.java b/src/main/java/Enigma/model/Morsecode.java
index abb6a77..f8c759c 100644
--- a/src/main/java/Enigma/model/Morsecode.java
+++ b/src/main/java/Enigma/model/Morsecode.java
@@ -1,51 +1,141 @@
 package Enigma.model;
 
-import java.util.TreeMap;
+import java.util.*;
+import java.util.Map.Entry;
 
+/**
+ * Diese Klasse definiert die Zugehörigkeit zwischen den Buchstaben A-Z und dem zugehörigen Morsecode.
+ * Die Funktionen sollen Texte von und zu Morsecode konvertieren.
+ */
 public class Morsecode {
-	TreeMap<String, String> codeMap = new TreeMap<>();
+	// Anlegen der codeMap als TreeMap
+	private TreeMap<String, String> codeMap = new TreeMap<>();
 
 	/**
-	 * Im Konstruktor werden alle Notwendigen Zeichen und deren zugehöriger Codes, der Treemap hinzugefügt.
+	 * Im Konstruktor werden alle verfügbaren Buchstaben (A-Z) und deren zugehörigen
+	 * Morsecodes, der codeMap hinzugefügt.
 	 */
 	public Morsecode() {
-		codeMap.put("A", "10110");
-		codeMap.put("B", "110101010");
-		codeMap.put("C", "1101011010");
-		codeMap.put("D", "1101010");
-		codeMap.put("E", "10");
-		codeMap.put("F", "101011010");
-		codeMap.put("G", "11011010");
-		codeMap.put("H", "10101010");
-		codeMap.put("I", "1010");
-		codeMap.put("J", "10110110110");
-		codeMap.put("K", "11010110");
-		codeMap.put("L", "101101010");
-		codeMap.put("M", "110110");
-		codeMap.put("N", "11010");
-		codeMap.put("O", "110110110");
-		codeMap.put("P", "1011011010");
-		codeMap.put("Q", "11011010110");
-		codeMap.put("R", "1011010");
-		codeMap.put("S", "101010");
-		codeMap.put("T", "110");
-		codeMap.put("U", "1010110");
-		codeMap.put("V", "101010110");
-		codeMap.put("W", "10110110");
-		codeMap.put("X", "1101010110");
-		codeMap.put("Y", "11010110110");
-		codeMap.put("Z", "1101101010");
-		// KA - Spruchanfang
-		codeMap.put("KA", "1101011010110");
-		// AR - Spruchende
-		codeMap.put("AR", "101101011010");
-		// VE - Verstanden
-		codeMap.put("VE", "10101011010");
-		// SK - Verkehrsende
-		codeMap.put("SK", "10101011010110");
+		this.codeMap.put("A", ".-");
+		this.codeMap.put("B", "-...");
+		this.codeMap.put("C", "-.-.");
+		this.codeMap.put("D", "-..");
+		this.codeMap.put("E", ".");
+		this.codeMap.put("F", "..-.");
+		this.codeMap.put("G", "--.");
+		this.codeMap.put("H", "....");
+		this.codeMap.put("I", "..");
+		this.codeMap.put("J", ".---");
+		this.codeMap.put("K", "-.-");
+		this.codeMap.put("L", ".-..");
+		this.codeMap.put("M", "--");
+		this.codeMap.put("N", "-.");
+		this.codeMap.put("O", "---");
+		this.codeMap.put("P", ".--.");
+		this.codeMap.put("Q", "--.-");
+		this.codeMap.put("R", ".-.");
+		this.codeMap.put("S", "...");
+		this.codeMap.put("T", "-");
+		this.codeMap.put("U", "..-");
+		this.codeMap.put("V", "...-");
+		this.codeMap.put("W", ".--");
+		this.codeMap.put("X", "-..-");
+		this.codeMap.put("Y", "-.--");
+		this.codeMap.put("Z", "--..");
 	}
 
-	public void getCode(char sign) {
+	/**
+	 * Diese Funktion überprüft ob das übergebene Buchstabe in der codeMap enthalten ist.
+	 * Wenn es enthalten ist, wird der zugehörige Morsecode zurück gegeben, ansonsten null
+	 *
+	 * @param buchstabe : char : Zu übersetzender Buchstabe
+	 * @return : String : Das zugehöriger Morsecode aus der codeMap
+	 */
+	private String getMorsecode(char buchstabe) {
+		// Testen ob das Char in der codeMap enthalten ist. Wenn ja, raussuchen und zurück geben
+		return this.codeMap.getOrDefault(String.valueOf(buchstabe).toUpperCase(), null);
+	}
+
+	/**
+	 * Der übergebene String wird in seine einzelnen Zeichen (char) zerlegt und an die Funktion getMorsecode
+	 * übergeben und der zugehörige Morsecode raus gesucht.
+	 * Mittels eines StringBuilders werden die Ergebnisse zu einem Rückgabe String zusammen gesetzt.
+	 * Wenn kein zugehöriger Code in der codeMap gefunden wurde, wird das Zeichen ignoriert da es bei der
+	 * Enigma nicht vorhanden war.
+	 *
+	 * @param input : String : Zu konventierender Text
+	 * @return String : Die in Morsecode konvertierte Text
+	 */
+	public String convertBuchstabeToMorsecode(String input) {
+		StringBuilder sb = new StringBuilder();
+		String morsecode;
+
+		// Durch alle char im übergebenen String loopen
+		for(int i = 0; i < input.length(); i++) {
+
+			// Wenn der char in der codeMap enthalten ist, an den Rückgabe String anheften, ansonsten nichts ignorieren.
+			morsecode = this.getMorsecode(input.charAt(i));
+			if(morsecode != null) {
+				sb.append(morsecode).append(' ');
+			}
+		}
+
+		// Gibt den konvertierten String zurück
+		return sb.toString();
+	}
+
+	/**
+	 * Diese Funktion überprüft ob der übergebene Morsecode in der codeMap enthalten ist.
+	 * Wenn er enthalten ist, wird der zugehörige Buchstabe zurück gegeben, ansonsten null
+	 *
+	 * @param morsecode : String : Der zu übersetzende Morsecode
+	 * @return : String : Das zugehöriger Buchstaben aus der this.codeMap
+	 */
+	private String getBuchstabe(String morsecode) {
+		// Initialisieren des Rückgabe Strings
+		// TODO: Darf bei der Initialisierung gleich einen Wert setzten lauf JAVA Konventionen?
+		String result = null;
+
+		// Loopt duch die Codemap und erstellt daraus ein Set
+		for(Entry<String, String> entry : this.codeMap.entrySet()) {
+			// Wenn Value dem Morsecode entspricht, haben wir unseren Buchstaben gefunden und setzen ihn als Result
+			if(entry.getValue().equals(morsecode)) {
+				result = entry.getKey();
+			}
+		}
+
+		return result;
+	}
+
+	/**
+	 * Der übergebene String wird in einen String Array zerlegt. Als Trennzeichen wird das Leerzeichen genutzt.
+	 * Anschließend wird der Array durchlaufen und die Elemente an die Funktion getBuchstabe übergeben um den
+	 * zugehörigen Buchstaben zu erhalten.
+	 * Mittels eines StringBuilders werden die Ergebnisse zu einem Rückgabe String zusammen gesetzt.
+	 * Wenn kein zugehöriger Buchstabe in der codeMap gefunden wurde, wird das Zeichen ignoriert da es bei der
+	 * Enigma nicht vorhanden war.
+	 *
+	 * @param input : String : Zu konventierender Morsecode
+	 * @return String : Der in Text konvertierte Morsecode
+	 */
+	public String convertMorsecodeToBuchstabe(String input) {
+		StringBuilder sb = new StringBuilder();
+		String buchstabe;
+
+		String[] morsecodes = input.split(" ");
+
+
+		// Durch alle char im übergebenen String loopen
+		for(String morsecode : morsecodes) {
+
+			// Wenn der char in der codeMap enthalten ist, an den Rückgabe String anheften, ansonsten nichts ignorieren.
+			buchstabe = this.getBuchstabe(morsecode);
+			if(buchstabe != null) {
+				sb.append(buchstabe).append(' ');
+			}
+		}
 
+		// Gibt den konvertierten String zurück
+		return sb.toString();
 	}
 }
-- 
GitLab