Eingaben in String Array einlesen

Bitte aktiviere JavaScript!
Ich soll als Anfänger-Aufgabe ein Programm schreiben, das eine Eingabe des Nutzers zu LeetSpeek (oder LeetSpeech?) konvertiert. Dabei sollen Arrays verwendet werden.
Jetzt hab ich nur das Problem, dass ich zwar weiß, wie man eine Eingabe einliest (java.util.scanner), jedoch nicht weiß, wie man diese Eingabe in einem Array speichert. Und eben auch nicht, wie und ob man es ohne lösen könnte.
Bisheriger Code hängt an.
Hilfe wäre von Nöten, da dies Teil einer verpflichtenden Abgabe ist.

import java.util.Scanner;

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

String [] alphabet = { "A" , "B" , "C" , "D" , "E" , "F" , "G" , "H", "I" , "J" , "K" , "L" , "M" , "N" , "O" , "P" , "Q" , "R" , "S" , "T" , "U" , "V" , "W" , "X" , "Y" , "Z" } ;
String [] leetSpeech = {"4" , "|3" , "[" , "1)" , "3" , "|=" , "9" , ")-(" , "|" , "_|" , "|<" , "|_" , "!V!" , "()" , "|°" , "0_" , "|2" , "$" , "+" , "v" , "V" , "W" , "><" , "°/" , "2"};

for (int k = 0; k < Eingabe.length(); k++) {
for (int i = 0; i < alphabet.length; i++) {
if(alphabet == Eingabe[k]) {
System.out.println(leetSpeech);
}
}
}

scanner.close();
}
}
 
A

Anzeige




Vielleicht hilft dir unser Kurs hier weiter —> (hier klicken)
Also es geht nicht darum, eine Eingabe in einem Array zu speichern, sondern doch eher, dass du auf die Buchstaben der Eingabe zugreifen willst, oder?

Die Eingabe liegt als String vor und die Beschreibung der Funktionalität eines Strings findet sich hier:
https://docs.oracle.com/javase/7/docs/api/java/lang/String.html
length() hast Du ja schon gefunden, charAt könnte interessant sein oder toCharArray. Aber auch substring wäre denkbar, da Du ja das alphabet in Strings und nicht in chars speicherst.

Und in deinem Code musst Du aufpassen:
a) Wenn Du auf ein Array zugreifen willst, dann darfst Du die [] nicht vergessen!
b) String vergleicht man mit equals und nicht mit ==
 
Geh deine Eingabe Zeichen für Zeichen durch. Ermittel an welcher stelle das Zeichen im Array alphabet vorkommt und nimm das Zeichen an der gleichen Position des leetSpeech Array.

In Pseudocode etwa so
Code:
String eingabe = scanner.input();
for(index = 0; index < eingabe.length; index++) {
    char zeichen = eingabe.charAt(index)
    int position = getPositionInAlphabet(zeichen)
    String leetspeech = getLeetSpeechAtPosition(position)
    output(leetspeech)
}
 
Geh deine Eingabe Zeichen für Zeichen durch. Ermittel an welcher stelle das Zeichen im Array alphabet vorkommt und nimm das Zeichen an der gleichen Position des leetSpeech Array.

In Pseudocode etwa so
Code:
String eingabe = scanner.input();
for(index = 0; index < eingabe.length; index++) {
    char zeichen = eingabe.charAt(index)
    int position = getPositionInAlphabet(zeichen)
    String leetspeech = getLeetSpeechAtPosition(position)
    output(leetspeech)
}
Mit dem, was du vorgeschlagen hast, hat es fast funktioniert, nur kann ich dann den char Zeichen nicht mit dem String (Array) Alphabet vergleichen. Und zu einem Char Array will sich das ganze nicht umformatieren lassen (wobei Strings doch eigentlich nur Char-Arrays sind, oder?).
Und das Einlesen eines Strings funktioniert gerade auch nicht, deshalb erstmal ein statischer Platzhalter. Das versuch ich dann in der Zwischenzeit herauszubekommen.

Code:
import java.util.Scanner;

public class LeetSpeechConverter {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in) ;
   
    String [] alphabet = { "A" , "B" , "C" , "D" , "E" , "F" , "G" , "H", "I" , "J" , "K" , "L" , "M" , "N" , "O" , "P" , "Q" , "R" , "S" , "T" , "U" , "V" , "W" , "X" , "Y" , "Z"} ;
    String [] leetSpeech = {"4" , "|3" , "[" , "1)" , "3" , "|=" , "9" , ")-(" , "|" , "_|" , "|<" , "|_" , "!V!" , "()" , "|°" , "0_" , "|2" , "$" , "+" , "v" , "V" , "W" , "><" , "°/" , "2"};
   
    //String [] TestEingabe = { "D" , "E" , "I" , "N" , "E" , "M" , "A" , "M" , "A"} ;
   
    String Eingabe = ("Ich kann nicht mehr!");
   
    for (int k = 0; k < Eingabe.length(); k++) {
        char zeichen = Eingabe.charAt(k) ;
        for (int i = 0; i < alphabet.length; i++) {
            if(alphabet[i] == zeichen) {
                System.out.println(leetSpeech[i]);
            } else {
                System.out.println(zeichen);   
            }
        }
    }
   
    scanner.close();
  }
}
 
Zuletzt bearbeitet:
Also ein char ist immer nur ein Zeichen. Das alphabet von Dir ließe sich umändern in ein char array, aber dann müsstest Du die Konstanten mit single quotes angeben, also 'A', 'B', ... statt "A", "B", ....

Du kannst aber auch aus Deinem Zeichen ein String machen. Statt charAt würdest Du dann substring nutzen mit Länge 1.
Oder wenn Du bei charAt bleiben willst: Du kannst das Zeichen an einen leeren String anhängen, also
Java:
char zeichen = "" + Eingabe.charAt(k);
Ganz viele Möglichkeiten. Aber wie schon gesagt: Wenn Du Strings vergleichen willst, musst du statt == die Funktion equals nutzen!

Und Deine Logik ist noch nicht ganz stimmig, aber das wirst Du sehen, wenn du es einmal ans laufen bekommen hast.
 
Update: Es läuft... Irgendwie.
Vielen Dank für die Hilfestellungen :)

Code:
import java.util.Scanner;

public class LeetSpeechConverter {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in) ;
    
    //String [] alphabet = { "A" , "B" , "C" , "D" , "E" , "F" , "G" , "H", "I" , "J" , "K" , "L" , "M" , "N" , "O" , "P" , "Q" , "R" , "S" , "T" , "U" , "V" , "W" , "X" , "Y" , "Z"} ;
    String Alphabet = ("ABCDEFGHIJKLMNOPQRSTUVWXYZ") ;
    String [] leetSpeech = {"4" , "|3" , "[" , "1)" , "3" , "|=" , "9" , ")-(" , "|" , "_|" , "|<" , "|_" , "!V!" , "N" , "()" , "|°" , "0_" , "|2" , "$" , "+" , "v" , "V" , "W" , "><" , "°/" , "2"};
    
    
    String EingabeTemp = scanner.nextLine() ;
    String Eingabe = EingabeTemp.toUpperCase() ;
    
    for (int k = 0; k < Eingabe.length(); k++) {
        char zeichenE = Eingabe.charAt(k) ;
        int kontrolle = 0;
        for (int i = 0; i < Alphabet.length(); i++) {
            char zeichenA = Alphabet.charAt(i) ;
            if(zeichenE != zeichenA) {
                kontrolle++;
            }
            if(zeichenA == zeichenE) {
                System.out.println(leetSpeech[i]);
            }
            if(kontrolle == 26) {
                System.out.println(zeichenE);
                kontrolle = 0;
            }
        }
    }
    
    scanner.close(); 
  }
}
 
Ohh ja, interessant, wie Du es mit der kontrolle gelöst hast. Auch Dein Wechsel hin zu Alphabet als String ist interessant, zumal Du nicht einfach einen Vorschlag umgesetzt hast sondern Du hast eine eigene Lösung gefunden. Erst einmal sehr gut.

Willst Du evtl. einmal versuchen, ob Du die innere Schleife in eine Funktion ausgliedern kannst? Oder seid ihr noch nicht so weit?
Dadurch könnte der Code noch einmal um einiges lesbarer und auch teilweise einfacher sein. Aber dazu müsste man Funktionen und die Rückgabe von Werten kennen.
 
Liegt es an meiner nachösterlichen geistigen Trägheit oder warum sehe ich nicht, welches Problem mit der kontrolle gelöst wurde?
Ich hab danach noch einmal die Aufgabenstellung gelesen, und mir ist aufgefallen, dass das Programm Zeichen, die nicht im Alphabet enthalten sind, unverändert wieder ausgeben soll.
Deshalb hab ich eine Funktion eingebaut, die das Zeichen "durchwinkt" wenn der Vergleich 26 mal fehlgeschlagen ist (Also mit allen Buchstaben des Alphabets)
 
Ohh ja, interessant, wie Du es mit der kontrolle gelöst hast. Auch Dein Wechsel hin zu Alphabet als String ist interessant, zumal Du nicht einfach einen Vorschlag umgesetzt hast sondern Du hast eine eigene Lösung gefunden. Erst einmal sehr gut.

Willst Du evtl. einmal versuchen, ob Du die innere Schleife in eine Funktion ausgliedern kannst? Oder seid ihr noch nicht so weit?
Dadurch könnte der Code noch einmal um einiges lesbarer und auch teilweise einfacher sein. Aber dazu müsste man Funktionen und die Rückgabe von Werten kennen.
Nein, das würde meine aktuellen Kentnisse übersteigen.
Ich hatte zwar mal ähnliche Operationen in C, kann mich jedoch selbst daran nur noch schwammig erinnern.
Ich soll dieses Programm zwar später noch als Funktion in ein anderes Programm einbauen, jedoch werden die Werte nicht von dem Programm weiter verwendet werden (Ergo: Print-Befehle reichen dann auch noch aus).
 
Liegt es an meiner nachösterlichen geistigen Trägheit oder warum sehe ich nicht, welches Problem mit der kontrolle gelöst wurde?
Das Problem ist halt, dass er, wenn es keinen Match gab, das Original Zeichen ausgeben wollte. Da mitzuzählen ist recht interessant. Ich hätte da ein Boolean genommen als Flag, um zu sehen, ob wir schon eine Ausgabe für das Zeichen hatten.
Mit eine Funktion getLeetString(Char) hätte halt beim ersten Treffer das Resultat geliefert und hätte nach der Schleife den Char als default Wert. Das würde das ersparen.

Aber ich finde es sehr erfrischend, wie hier auf Vorschläge eingegangen wird. Es geht ganz offensichtlich nicht nur um eine Lösung zum kopieren sondern um das Verständnis und dann der eigenen Umsetzung. Gerade nach den letzten Tagen empfinde ich das als sehr positiv :)
 
Nein, das würde meine aktuellen Kentnisse übersteigen.
Ich hatte zwar mal ähnliche Operationen in C, kann mich jedoch selbst daran nur noch schwammig erinnern.
Ich soll dieses Programm zwar später noch als Funktion in ein anderes Programm einbauen, jedoch werden die Werte nicht von dem Programm weiter verwendet werden (Ergo: Print-Befehle reichen dann auch noch aus).
Das ist ok, dem müssen wir dann auch nicht vorgreifen. Evtl. kommen wir ja später noch einmal darauf zurück.
 
Deshalb hab ich eine Funktion eingebaut, die das Zeichen "durchwinkt" wenn der Vergleich 26 mal fehlgeschlagen ist (Also mit allen Buchstaben des Alphabets)
OK, nachösterliche geistige Trägheit :) Ich hätte die if-Abfrage nach der Schleife erwartet aber so funktioniert es natürlich auch.
 
Passende Stellenanzeigen aus deiner Region:

Oben