Direkt zum Hauptbereich

Palindrome & Java

Einleitung

Zu einen der ersten Projekte, die man beim Lernen von Programmiersprachen programmiert, ist ein "Palindrom-Prüfer". Ein Benutzer soll die Möglichkeit haben ein Wort (oder sogar einen ganzen Satz) einzugeben und dann soll das Programm überprüfen, ob es sich bei der Eingabe um ein Palindrom handelt. Genau das wird im Folgenden mit Java behandelt, nur etwas unnötig kompliziert.

Main.java

Innerhalb der Main.java-Datei werden nun die nötigen Packete eingebunden:

import java.util.HashMap;
import java.util.Scanner; // for user-input

Dann können wir auch schon die Main-Klasse und die main-Funktion definieren:

public class Main {
    public static void main(String[] args) {}
}

Der Benutzer soll nun die Möglichkeit haben sein Wort als Parameter in der args-Variable mitzuliefern, muss natürlich zuerst überprüft werden, ob überhaupt noch ein weiterer Parameter mitgeliefert wurde:

String word = "";
if (args.length >= 1) {
    word = args[0];
}

Sollte das nicht der Fall sein, kann der Benutzer doch noch sein Wort angeben:

else {
    Scanner scanner_obj = new Scanner(System.in);
    System.out.print("Enter the word: ");
    word = scanner_obj.nextLine();
    scanner_obj.close();
}

Damit der Code übersichtlich bleibt, wird eine separate Funktion check_word definiert, die als Parameter die String-Variable word mitgeliefert bekommt und einen Integer als Rückgabewert hat:

int status = check_word(word);
if (status == 1) {
    System.out.println("The word '"+word+"' is a palindrome.");
} else if (status == 0) {
    System.out.println("The word '"+word+"' is not a palindrome!");
} else {
    System.out.println("Couldn't determine if it's a palindrome or not!");
}

Da der Benutzer nun auch Wörter wie 'Otto' oder 'oTtO' eingeben kann, können wir nicht einfach die Buchstaben vergleichen. Davor müssen also noch die Buchstaben entweder in lowercase oder uppercase umgewandelt werden. Hierfür gäbe es eigentlich bereits die Funktion toUpperCase(), aber zur Übung verkompliziere ich es hier:

static char[] make_word_uppercase(String word) {
    char[] letters = word.toCharArray();
    HashMap<Character,Character> lower_to_upper_hashmap = new HashMap();
    char[] lower_alphabet = "abcdefghijklmnopqrstuvwxyz".toCharArray();
    char[] upper_alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
    for (int i = 0; i < lower_alphabet.length; i++) {
        lower_to_upper_hashmap.put(lower_alphabet[i],upper_alphabet[i]);
    }
    char[] new_word = letters;
    for (int i = 0; i < word.length(); i++) {
        if ((int)letters[i] >= 97 && (int)letters[i] <= 122) { // ASCII Codes of 'a' and 'z'
            new_word[i] = lower_to_upper_hashmap.get(letters[i]);
        } else {
            new_word[i] = letters[i];
        }
    }
    return new_word;
}

Wessen Stirn zuvor gerunzelt wurde, weshalb hier eine HashMap benutzt wurde: Deswegen. Da die check_word-Funktion nun einen String erhalten hat und ich lieber mit char-arrays arbeite, wird nun noch die Funktion toCharArray() benutzt. Innerhalb der for-Schleife wird der ASCII-Code von jedem Zeichen im char-array überprüft, ob sich der Integer zwischen 96 und 123 befindet. Das sind nämlich die ASCII-Codes vom Buchstaben 'a' und 'z'. Wird dann beispielsweise ein 'a' gefunden, wird in einem neuen char-array statt dem Buchstaben 'a' ein 'A' eingesetzt. Befindet sich das derzeitige Zeichen nicht im lower_alphabet, wird das Zeichen unverändert in new_word gespeichert. Nun können wir zur eigentlichen Funktion check_word kommen:

static int check_word(String this_word) {
    char[] word = make_word_uppercase(this_word);
    int status = 1; // for true
    for (int i = 0; i < word.length; i++) {
        try {
            if (word[i] != word[word.length-1-i]) {
                status = 0; // for false
                break;
            }
        } catch (Exception e) {
            System.out.println("An error occured: "+e.toString());
            status = -1; // for unknown
            break;
        }
    }
    return status;
}

Innerhalb der for-Schleife wird lediglich noch überprüft, ob beispielsweise das Wort an Stelle 0 dem entspricht, was an Stelle 'Länge des Wortes'-1 steht. Das -1, da hier mit Indizes gearbeitet wird. Man könnte diesen Code noch insofern verbessern, dass beispielsweise Leerzeichen gefiltert werden. Verbesserungsvorschläge sind erwünscht und dürfen gerne in den Kommentaren propagiert werden.

Der vollständige Code: GitHub/Pulsar7

Kommentare

Beliebte Posts aus diesem Blog

PSE - Python GUI-App

Abb. 1 GitHub: https://github.com/Pulsar7/PSE Zusammenfassung Ich bin kein verifizierter Chemiker oder ein anderweitig akademisch Ausgebildeter, der die angegeben Informationen zum Periodensystem verifizieren kann. Die verwendeten Daten werden unten geschildert. Meine Idee zur Visualisierung ist relativ simpel. Zu jedem Element wird ein Button -Element erstellt worin Basisinformationen zum jeweiligen Element angezeigt werden: Ordnungszahl Masse (u) Symbol Damit das Layout “moderner” aussieht, wollte ich zu Beginn das Modul ttkbootstrap einbinden, was jedoch nicht so geklappt hat, wie ich es mir vorgestellt hatte. Das Periodensystem wird in 11 Serien unterschieden und hierzu werden 11 verschiedene Farben benötigt. Da ich jedoch keinerlei Möglichkeit finden konnte, wie ich Farben zu ttkbootstrap hinzufügen könnte, habe ich das Modul vorerst ausgeschlossen. Update 1.3 Es wurden mehr Informationen zu jedem einzelnen PSE-Element hinzufügt. Damit die Daten auch sinnvoll ges

Euklidischer Algorithmus in Java

Einleitung Ein bekannter Algorithmus zum Berechnen des größten gemeinsamen Teilers (kurz: ggT), ist der euklidische Algorithmus und in diesem Artikel soll genau dieser Algorithmus in Java nachkonstruiert werden. Main.java Auch dieses Mal wird wieder das String-Array args aus der main -Funktion benutzt um die Benutzeingabe abzufragen. Da dieses Mal keine zusätzlichen Bibliotheken benötigt werden, beginne ich mit gleich mit der Verarbeitung der Benutzeingabe: if (args.length == 2) { char[] first_number = args[0].toCharArray(); char[] second_number = args[1].toCharArray(); if (check_number(first_number) == true) { if (check_number(second_number) == true) {} } } Auch in diesem Code habe ich das String-Array in ein Char-Array umgeformt, damit die einzelnen Character in der chec