int[] histogram = getHistogram(text);
int indexOfMaximumEntry = getIndexOfMaximumEntry(histogram);
float quantity = histogram[indexOfMaximumEntry];
Ach ja - das hatte ich in meiner Antwort so nicht mehr im Blick. Damit ist mein Punkt mit dem Cast hin zum char natürlich Unsinn. Der Index sollte dann ja tatsächlich das Zeichen sein.Index = ASCII wert.
Ich bin erst seit Kurzem im Java Forum dabei, weshalb ich noch nicht so ganz weiß, wie man den gesamten Code hier teilen kann.Also erst ein mal ist es unschön, nur ein Bildschirmfoto auszugeben auf dem zudem nur sehr wenig zu sehen ist.
Aber was gibt die Methode getIndexOfMaximumEntry wohl zurück (So die Methode macht, was der Name sagt und das nicht ein Fall von: "Ich verarsche mich einfach selbst" ist.)
Und generell: Wann immer du einen Typen castet, dann solltest Du immer ganz genau aufpassen. Das ist in der Regel bei Rückgaben von Methoden ganz schlecht: Entweder ist der Cast schicht Müll oder die Methode ist Schrott (Was ich oben schon als ein Fall von "Ich verarsche mich einfach selbst" bezeichnet habe!)
Also ganz wichtig: Das mit dem "verarschen" bezieht sich nicht auf Dich sondern nur auf Code. Code sollte das machen, was er aussagt. Und wenn eine Methode einen int zurück gibt, dann sollte das auch ein int sein vom Wert her. Das sollte dann kein char sein. Wenn die Methode einen char zurückgeben sollte, dann sollte es auch den Rückgabetyp char haben. Ich hoffe, ich konnte das deutlich machen.
Das Array historam beinhaltet ja genau an der gleichen Index stelle wie das Zeichen die Anzahl wie oft es vor kommt . Also was brauchst du ?
Index = ASCII wert.
Java:int[] histogram = getHistogram(text); int indexOfMaximumEntry = getIndexOfMaximumEntry(histogram); float quantity = histogram[indexOfMaximumEntry];
So sieht mein Code bis jetzt aus, jedoch lässt sich der zu entschlüssende Text nicht entschlüsseln. Ich vermute, dass mein Fehler in der decode Methode liegt. Die Aufgabe ist es den häufigsten Buchstaben in beiden Texten zu finden und so die Geheimbotschaft zu entschlüsseln. Im code sind auch viele Kommentare, da es sich um Tests handelt, die sind jedoch nicht sehr relevant.public class CaesarChiffre {
public static final String GERMAN_LANGUAGE_PATTERN = "Werden zwei Glasstaebe mit einem Wolltuch gerieben, dann kann man feststellen, dass sich die beiden Staebe gegenseitig abstossen. Wird das gleiche Experiment mit zwei Kunststoffstaeben wiederholt, dann bleibt das Ergebnis gleich, auch diese beiden Staebe stossen sich gegenseitig ab. Im Gegensatz dazu ziehen sich ein Glas und ein Kunststoffstab gegenseitig an. Diese mit den Gesetzen der Mechanik nicht zu erklaerende Erscheinung fuehrt man auf Ladungen zurueck. Da sowohl Anziehung als auch Abstossung auftritt, muessen zwei verschiedene Arten von Ladungen existieren. Man unterscheidet daher positive und negative Ladungen.";
public static final String ENCRYPTED_MESSAGE = "ugjt iwv! fw jcuv fgp eqfg igmpcemv wpf fkt uq twjo wpf gjtg gtyqtdgp.pqtocngtygkug mcpp ocp jkgt inwgjygkp qfgt cgjpnkejgu igykppgp. fkgu hcgnnvkp fkgugo ugoguvgt ngkfgt cwu... uqtt{";
public static final char SEPARATOR = ' ';
//int[] histogram = new int[]{10, 11, 88, 2, 12, 120};
public static void main(String[] args){
//int[] array = new int[]{10, 11, 88, 2, 125, 120};
//int maxIndex = getIndexOfMaximumEntry(array);
int[] histogram = getHistogram(ENCRYPTED_MESSAGE);
getSignificantLetter(ENCRYPTED_MESSAGE);
int l = getIndexOfMaximumEntry(histogram);
char significantLetter = (char) l;
int quantity = getIndexOfMaximumEntry(histogram);
System.out.println("Unreadable, encrypted input text: " +
ENCRYPTED_MESSAGE);
String decodedText = decode();
System.out.println("Readable, decoded output text: " +
decodedText);
}
public static int getIndexOfMaximumEntry(int[] values) {
int maxIndex = values[0];
int index = 0;
for (int i = 0; i < values.length ; i++) {
if (maxIndex < values) {
maxIndex = values;
// index = i;
}
}
// System.out.println("Index position of Maximum value in the array is : " + index);
return maxIndex;
}
public static int[] getHistogram(String s) {
int[] histogram = new int[128];
String str = s.toLowerCase();
for (int i = 0; i < str.length(); i++) {
char v = str.charAt(i);
histogram[v] = histogram[v] +1;
}
return histogram;
}
public static char getSignificantLetter(String a) {
int[] histogram = getHistogram(a);
char significantLetter = (char) getIndexOfMaximumEntry(histogram);
float quantity = getIndexOfMaximumEntry(histogram);
int b = 0;
for (int i = 0; i < histogram.length; i++) {
if (histogram != (int) SEPARATOR) {
b += histogram;
}
}
double quota2 = (((double) quantity / (double) b) * 100);
int quota1 = (int) quota2;
System.out.println(" ");
System.out.println("Most significant letter: " + significantLetter);
System.out.println("Quantity: " + quantity + " times (" + quota1 + " % of whole text).");
return significantLetter;
}
public static int getShift(String encryptedText, String languagePattern) {
char sigOfChiffre = getSignificantLetter(encryptedText);
char sigOfPattern = getSignificantLetter(languagePattern);
int shift = (sigOfPattern - sigOfChiffre);
System.out.println("Most significant letter in the pattern text: " +sigOfPattern);
System.out.println("Most significant letter in the encrypted text: " + sigOfChiffre);
System.out.println("Resulting shift: " +shift);
return shift;
}
public static String decode(String encryptedText, String languagePattern ) {
int shift = getShift(encryptedText, languagePattern);
char[] lettersEncryptedText = encryptedText.toCharArray();
for (int i = 0; i < lettersEncryptedText.length; i++) {
if ( lettersEncryptedText >= 128) {
lettersEncryptedText += shift;
}
}
String decoded = new String(lettersEncryptedText);
return decoded;
}
}
Im Editor oben links auf </> klicken, dort Java auswählen und in das Textfeld einfügen.weshalb ich noch nicht so ganz weiß, wie man den gesamten Code hier teilen kann.
char significantLetter = (char) getIndexOfMaximumEntry(histogram);
float quantity = getIndexOfMaximumEntry(histogram);
Mal unabhängig vom bereits geschriebenen: Wenn du den häufigsten Buchstaben im Text suchst, dann ist das am Ende natürlich ein Zeichen. Was würdest du denn erwarten?In der Aufgabe soll ich den Häufigsten Buchstaben im Text bestimmen, jedoch erhalte ich bloß ein Zeichen.
Sie können auch etwas respektvoller antworten oder Sie sind sie einfach jemand der immer meckern muss. Ihren ganzen Beiträgen zufolge reagieren Sie gerne genervt. Ich schau mir ihre Beiträge nochmal an Vielen Dank für ihre hilfreiche und ausführliche Antwort.Mal von deinen Syntax Fehlern abgesehen der Code so wie du ihn uns gegeben hast kann nicht Kompiliert werden.
Was soll das?
zweimal das gleicheJava:char significantLetter = (char) getIndexOfMaximumEntry(histogram); float quantity = getIndexOfMaximumEntry(histogram);
Ich habe dir schon gezeigt wie du an die Anzahl der meisten Buchstaben kommst.
Wenn du nicht lesen willst kann man dir auch nicht helfen.
Was die anschließende for schleife soll erschießt sich mir auch nicht.
Wenn du den link den ich dir in deinen ersten Thread gegen habe bis zum Ende anschaust und nicht irgend ein Code Fragment aus der Mitte ohne nachzudenken benutzt bist du selber schuld.
den Rest bin ich nicht durchgegangen.
PS.
selbst die Methode "getIndexOfMaximumEntry" ist falsch .
Der User aus dem anderen link hatte die Methode richtig ich habe da nur noch das mit dem Separator hinzugefügt. Du kannst ja nicht mal richtig abschreiben.
Ich kann nicht abschreiben und Sie wissen nicht, wie man sich zu verhalten hat Sie eingebildeter *****Mal von deinen Syntax Fehlern abgesehen der Code so wie du ihn uns gegeben hast kann nicht Kompiliert werden.
Was soll das?
zweimal das gleicheJava:char significantLetter = (char) getIndexOfMaximumEntry(histogram); float quantity = getIndexOfMaximumEntry(histogram);
Ich habe dir schon gezeigt wie du an die Anzahl der meisten Buchstaben kommst.
Wenn du nicht lesen willst kann man dir auch nicht helfen.
Was die anschließende for schleife soll erschießt sich mir auch nicht.
Wenn du den link den ich dir in deinen ersten Thread gegen habe bis zum Ende anschaust und nicht irgend ein Code Fragment aus der Mitte ohne nachzudenken benutzt bist du selber schuld.
den Rest bin ich nicht durchgegangen.
PS.
selbst die Methode "getIndexOfMaximumEntry" ist falsch .
Der User aus dem anderen link hatte die Methode richtig ich habe da nur noch das mit dem Separator hinzugefügt. Du kannst ja nicht mal richtig abschreiben.
Ich habe als häufigsten Buchstaben Häufigsten Buchstaben einmal eine ] erhalten und einmal ein rechteckiges Zeichen, jedoch ist der häufigste Buchstabe in dem einen Text ein j und im anderen ein e. Ich schau nochmal drüber und versuch einiges zu korrigieren.Mal unabhängig vom bereits geschriebenen: Wenn du den häufigsten Buchstaben im Text suchst, dann ist das am Ende natürlich ein Zeichen. Was würdest du denn erwarten?
Mann sollte schon erwarten können das ein Link den ich gebe auch bis zum Ende gelesen wird.Sie können auch etwas respektvoller antworten oder Sie sind sie einfach jemand der immer meckern muss. Ihren ganzen Beiträgen zufolge reagieren Sie gerne genervt. Ich schau mir ihre Beiträge nochmal an Vielen Dank für ihre hilfreiche und ausführliche Antwort.
PS. Sie können nicht erwarten, dass jemand, der zum Ersten Mal eine Java Aufgabe bearbeitet schon alles richtig macht
Mal unabhängig vom bereits geschriebenen: Wenn du den häufigsten Buchstaben im Text suchst, dann ist das am Ende natürlich ein Zeichen. Was würdest du denn erwarten?
Entschuldigen Sie, dass ich versuche erstmal selber den Code zu schreiben, da es mir nichts bringt einfach einen abzuschreiben. Ich wollte lediglich einige Tipps.Mann sollte schon erwarten können das ein Link den ich gebe auch bis zum Ende gelesen wird.
So noch mal der link schaue Post #49 da hast du den Code.
public static int getIndexOfMaximumEntry(int[] values) {
int maxIndex = values[0];
int index = 0;
for (int i = 0; i < values.length ; i++) {
if (maxIndex < values[i]) {
maxIndex = values[i];
// index = i;
}
}
int maxIndex = 0;
int maxAnzahl = 0 ;
for (int i = 0; i < array.length; i++) {
if (array[i] > maxAnzahl ) {
maxAnzahl = array[i];
maxIndex = i;
}
Was du falsch machst? Du solltest die Aufgabe Schritt um Schritt erledigen.In der Aufgabe soll ich den Häufigsten Buchstaben im Text bestimmen, jedoch erhalte ich bloß ein Zeichen. Was habe ich falsch gemacht?
int[] getHistogram( String text )
int [] histogram = getHistogram("Hallo")
histogram[72] --- 1 // 1 x H
histogram[97] --- 1 // 1 x a
histogram[108] --- 2 // 2 x l
histogram[111] --- 2 // 1 x o
int[] getHistogram( String text ){
int[] histogram = new int[128]; // Groesse der ASCII Tabelle
for( int i= 0; i < text.lenght; i++ ){
char c = text.charAt(i); // der augenblickliche Buchstabe
// erhöhe den Wert am korrespondierenden Index in histogram um 1
}
return histogram;
}
selbst geschrieben nur zum Teil.
und dann noch die Fehler von dem anderen User einfach kopiert.
Wie auch schon in dem Link gesagt wurde gehört das prüfen mit dem Separator auch in die getIndexOfMaximumEntry Methode. Nicht danach. Geht auch aus der Aufgabenstellung hervor
PS wir sind
Wenn du dir anaschaust was du zur Grundlage benutzt hast solltest du nun den Fehler erkennen.
Das ist aus dem anderen Thread.
Java:int maxIndex = 0; int maxAnzahl = 0 ; for (int i = 0; i < array.length; i++) { if (array[i] > maxAnzahl ) { maxAnzahl = array[i]; maxIndex = i; }
Vielen Dank, ich habe jetzt alles außer die entschlüsselte Botschaft. Ich muss noch das Intervall in die if bedingung einfügen aber ich weiß noch nicht ganz wie [ Intervall geht von a +-shift bis z +- shift]Was du falsch machst? Du solltest die Aufgabe Schritt um Schritt erledigen.
Der erste und wichtigste Schritt, ist es zu verstehen, was genau zu tun ist.
Deinem Bildschirmfoto entnehme ich, dass du eine Funktionbenötigst.Java:int[] getHistogram( String text )
Jetzt legen wir erst einmal die eigentliche Aufgabe, den häufigsten Buchstaben zu finden, auf die Seite.
Wir konzentrieren uns nur auf diese Funktion. Sie hat als Eingabe einen Text und als Ausgabe Array von Integer Werten.
Jeder Wert des Arrays repräsentiert dabei die Anzahl eines bestimmten im Text gefundenen Zeichens.
z.B.ergibtJava:int [] histogram = getHistogram("Hallo")
Hier eine ASCII Tabelle zum Vergleichen hier verwenden wir 128 Zeichen was der Größe des zurückgegebenen Arrays entspricht.Java:histogram[72] --- 1 // 1 x H histogram[97] --- 1 // 1 x a histogram[108] --- 2 // 2 x l histogram[111] --- 2 // 1 x o
Anhang anzeigen 16864
Der erste und Schritt ist also die Funktion zu schreiben.
Wenn die Funktion funktioniert , dann mach mit dem Rest der Aufgabe weiter.Java:int[] getHistogram( String text ){ int[] histogram = new int[128]; // Groesse der ASCII Tabelle for( int i= 0; i < text.lenght; i++ ){ char c = text.charAt(i); // der augenblickliche Buchstabe // erhöhe den Wert am korrespondierenden Index in histogram um 1 } return histogram; }
public static String decode(String encryptedText, String languagePattern ) {
int shift = getShift(encryptedText, languagePattern);
char[] lettersEncryptedText = encryptedText.toCharArray();
for (int i = 0; i < lettersEncryptedText.length; i++) {
if ( lettersEncryptedText[i] >= 128) {
lettersEncryptedText[i] += shift;
}
}
String decoded = new String(lettersEncryptedText);
return decoded;
Die Klasse heißt CaesarChiffre, dann wird es wohl das seinIch verstehe nicht ganz was du machen willst mit den beiden Strings
Was die Codierung sein soll?
Shift habe ich bereits berechnet.Die Klasse heißt CaesarChiffre, dann wird es wohl das sein
Oder meinst du die Berechung von "shift"?
Ich weiß nicht wie ich die Intervallgrenzen in der if Bedingung darstellen soll, da ich im Internet bis jetzt nur Intervalle als Arrays gefunden habe. Mein Ansatz sieht bis jetzt so aus : if ( lettersEncryptedText >= ('a' - shift) && ( lettersEncryptedText <= ('z' - shift))Die Klasse heißt CaesarChiffre, dann wird es wohl das sein
Oder meinst du die Berechung von "shift"?
sinnvoller ist es vielleicht die ganze Aufgabe zu posten.
ich dachte die Aufgabe ist mit k) zuende