Strings und StringBuilder

Status
Nicht offen für weitere Antworten.

Jay1980

Bekanntes Mitglied
Servus,

mir leuchtet nicht ein, wieso es mir da meinen Buchstaben nicht vertauscht?

Ziel ist dass die Buchstaben meines Eingabestrings getauscht werden.

So ist mein Versuch, aber es vertauscht nichts. Es scheint was mit der Unveränderlichkeit von Strings zu tun zu haben, wobei ich meine Vorhaben schon mit StringBuilder getestet habe. Der Block mit dem a wird für jedes a-Zeichen des Strings ausgeführt, aber getauscht wird es nicht. Einer eine Idee, was da schief läuft.

Java:
int stringLength = this.inputString.length();
		this.encString = this.inputString;
		
		for ( int i = 0; i < stringLength; i++)
		{
			
			this.encString = new StringBuilder(this.inputString); // Check ob das dann auch nur callbyvalue ist 
			
			char currentLetter = this.encString.charAt(i);
			
			System.out.println("Aktueller Durchlauf zum Encrypten mit currentLetter " + currentLetter);
			
			if (currentLetter == 'a') 
			{ 
				System.out.println( "Block zum Buchstaben a wird ausgeführt." );
				currentLetter = 'd';
				this.encString.setCharAt(i, currentLetter);
				System.out.println("Aktueller String nach dem a-Durchlauf: " + this.encString);
			}
			
			if (currentLetter == 'b') { currentLetter = 'e'; }
			if (currentLetter == 'c') { currentLetter = 'f'; }
			if (currentLetter == 'd') { currentLetter = 'g'; }
			if (currentLetter == 'e') { currentLetter = 'h'; }
 

0x7F800000

Top Contributor
mir leuchtet nicht ein, wieso es mir da meinen Buchstaben nicht vertauscht?

Ziel ist dass die Buchstaben meines Eingabestrings getauscht werden.

So ist mein Versuch, aber es vertauscht nichts. Es scheint was mit der Unveränderlichkeit von Strings zu tun zu haben
nnein, das liegt wohl viel mehr an spaghetticode :eek:

Java:
int stringLength = this.inputString.length();
was soll eine derartige zeile überhaupt jemals in irgendeinem code zu suchen haben? ???:L
Java:
		this.encString = this.inputString;
ich hab kA was du hier vorhattest, aber das ist copy by reference, macht so im freien Gelände nur in seltensten fällen sinn.
Java:
			this.encString = new StringBuilder(this.inputString);
so macht die zeile davor erst recht keinen sinn, weil du alles wieder überschreibst...
Von welchem typ ist dieses encString? CharacterSequence oder irgendsoein murks oder wie?
Java:
			this.encString.setCharAt(i, currentLetter);
das kann nichts bringen, da du diese "encString" variable eh in jedem durchlauf durch ein neuen StringBuilder ersetzst, der den inhalt des ursprünglichen inputStrings enthält.

Java:
			if (currentLetter == 'b') { currentLetter = 'e'; }
			if (currentLetter == 'c') { currentLetter = 'f'; }
			if (currentLetter == 'd') { currentLetter = 'g'; }
			if (currentLetter == 'e') { currentLetter = 'h'; }
das ist alles andere als dry, bzw das ist einfach unschön. Ersetze das durch eine schleife, musst doch den kram nicht eine milliarde mal dahinschreiben...:noe:
 

Jay1980

Bekanntes Mitglied
Danke erstmal,

ich bin noch einmal durchgegangen, der Hinweis mit dem call by reference war gut, das wollte ich ohnehin noch klären und ich will natürlich kein call by reference. Das mit der Schleife mach ich mal, wenn das Programm richtig funktioniert - das ist jetzt erstmal das Hauptanliegen, wenn ich dafür 5min länger Copy&Paste machen muss, ist mir das aktuell Wurst.

Hier mal der leicht überarbeitete Code , einige Buchstaben werden schon ausgetauscht, aber nicht die passenden nach den Verzweigungsblöcken, dann erhalte ich bei der Anforderung sogar 'null' für den angezeigten encrypted String.

Kurz zum Verhalten:
Es wird erst ein Formular angeboten, darin wird der String eingegeben, dann wird die Klasse mit dem CaesarChiffre aufgerufen, dann wird je nach gedrücktem JButton entweder codiert oder decodiert. Aktuell lafft das bei mir nicht und irgendwo muss da ein Riesenschnitzer drin sein ....

Danke vorab für einen Hinweis.

Java:
public class JobaCaesarChiffre 
{
	private String inputString;
	private StringBuilder encString;
	private StringBuilder decString;
	
	/** Konstruktor */
	JobaCaesarChiffre( String flag, String instr )
	{
		this.inputString = instr;
		
		if ( flag == "encode")
		{
			this.computeEncryptedString();
		}
		
		if ( flag == "decode")
		{
			this.computeDecryptedString();
		}
		
	}
	
	/** Chiffre aus Klartext bilden */
	private void computeEncryptedString()
	{
		// Ein Buchstabe muss im Alphabet drei Plätze nach vorn verschoben werden
		// also Klartextzeichen | Chiffrezeichen
		this.encString = new StringBuilder(this.inputString);
		
		for ( int i = 0; i < this.inputString.length(); i++)
		{ 	
			char currentLetter = this.inputString.charAt(i);
			
			if (currentLetter == 'a') { currentLetter = 'd'; this.encString.setCharAt(i, currentLetter); }
			if (currentLetter == 'b') { currentLetter = 'e'; this.encString.setCharAt(i, currentLetter); }		
			if (currentLetter == 'c') { currentLetter = 'f'; this.encString.setCharAt(i, currentLetter); }
			if (currentLetter == 'd') { currentLetter = 'g'; this.encString.setCharAt(i, currentLetter); }
			if (currentLetter == 'e') { currentLetter = 'h'; this.encString.setCharAt(i, currentLetter); }
			if (currentLetter == 'f') { currentLetter = 'i'; this.encString.setCharAt(i, currentLetter); }
			if (currentLetter == 'g') { currentLetter = 'j'; this.encString.setCharAt(i, currentLetter); }
			if (currentLetter == 'h') { currentLetter = 'k'; this.encString.setCharAt(i, currentLetter); }
			if (currentLetter == 'i') { currentLetter = 'l'; this.encString.setCharAt(i, currentLetter); }
			if (currentLetter == 'j') { currentLetter = 'm'; this.encString.setCharAt(i, currentLetter); }
			if (currentLetter == 'k') { currentLetter = 'n'; this.encString.setCharAt(i, currentLetter); }
			if (currentLetter == 'l') { currentLetter = 'o'; this.encString.setCharAt(i, currentLetter); }
			if (currentLetter == 'm') { currentLetter = 'p'; this.encString.setCharAt(i, currentLetter); }
			if (currentLetter == 'n') { currentLetter = 'q'; this.encString.setCharAt(i, currentLetter); }
			if (currentLetter == 'o') { currentLetter = 'r'; this.encString.setCharAt(i, currentLetter); }
			if (currentLetter == 'p') { currentLetter = 's'; this.encString.setCharAt(i, currentLetter); }
			if (currentLetter == 'q') { currentLetter = 't'; this.encString.setCharAt(i, currentLetter); }
			if (currentLetter == 'r') { currentLetter = 'u'; this.encString.setCharAt(i, currentLetter); }
			if (currentLetter == 's') { currentLetter = 'v'; this.encString.setCharAt(i, currentLetter); }
			if (currentLetter == 't') { currentLetter = 'w'; this.encString.setCharAt(i, currentLetter); }
			if (currentLetter == 'u') { currentLetter = 'x'; this.encString.setCharAt(i, currentLetter); }
			if (currentLetter == 'v') { currentLetter = 'y'; this.encString.setCharAt(i, currentLetter); }
			if (currentLetter == 'w') { currentLetter = 'z'; this.encString.setCharAt(i, currentLetter); }
			if (currentLetter == 'x') { currentLetter = 'a'; this.encString.setCharAt(i, currentLetter); }
			if (currentLetter == 'y') { currentLetter = 'b'; this.encString.setCharAt(i, currentLetter); }
			if (currentLetter == 'z') { currentLetter = 'c'; this.encString.setCharAt(i, currentLetter); }	
		}
	}
	
	/** Klartext aus Chiffre bilden */
	private void computeDecryptedString()
	{
		this.decString = new StringBuilder(this.inputString);
		
		for ( int i = 0; i < this.inputString.length(); i++)
		{
			char currentLetter = this.inputString.charAt(i);
			
			if (currentLetter == 'a') { currentLetter = 'x'; this.decString.setCharAt(i, currentLetter); }
			if (currentLetter == 'b') { currentLetter = 'y'; this.decString.setCharAt(i, currentLetter); }
			if (currentLetter == 'c') { currentLetter = 'z'; this.decString.setCharAt(i, currentLetter); }
			if (currentLetter == 'd') { currentLetter = 'a'; this.decString.setCharAt(i, currentLetter); }
			if (currentLetter == 'e') { currentLetter = 'b'; this.decString.setCharAt(i, currentLetter); }
			if (currentLetter == 'f') { currentLetter = 'c'; this.decString.setCharAt(i, currentLetter); }
			if (currentLetter == 'g') { currentLetter = 'd'; this.decString.setCharAt(i, currentLetter); }
			if (currentLetter == 'h') { currentLetter = 'e'; this.decString.setCharAt(i, currentLetter); }
			if (currentLetter == 'i') { currentLetter = 'f'; this.decString.setCharAt(i, currentLetter); }
			if (currentLetter == 'j') { currentLetter = 'g'; this.decString.setCharAt(i, currentLetter); }
			if (currentLetter == 'k') { currentLetter = 'h'; this.decString.setCharAt(i, currentLetter); }
			if (currentLetter == 'l') { currentLetter = 'i'; this.decString.setCharAt(i, currentLetter); }
			if (currentLetter == 'm') { currentLetter = 'j'; this.decString.setCharAt(i, currentLetter); }
			if (currentLetter == 'n') { currentLetter = 'k'; this.decString.setCharAt(i, currentLetter); }
			if (currentLetter == 'o') { currentLetter = 'l'; this.decString.setCharAt(i, currentLetter); }
			if (currentLetter == 'p') { currentLetter = 'm'; this.decString.setCharAt(i, currentLetter); }
			if (currentLetter == 'q') { currentLetter = 'n'; this.decString.setCharAt(i, currentLetter); }
			if (currentLetter == 'r') { currentLetter = 'o'; this.decString.setCharAt(i, currentLetter); }
			if (currentLetter == 's') { currentLetter = 'p'; this.decString.setCharAt(i, currentLetter); }
			if (currentLetter == 't') { currentLetter = 'q'; this.decString.setCharAt(i, currentLetter); }
			if (currentLetter == 'u') { currentLetter = 'r'; this.decString.setCharAt(i, currentLetter); }
			if (currentLetter == 'v') { currentLetter = 's'; this.decString.setCharAt(i, currentLetter); }
			if (currentLetter == 'w') { currentLetter = 't'; this.decString.setCharAt(i, currentLetter); }
			if (currentLetter == 'x') { currentLetter = 'u'; this.decString.setCharAt(i, currentLetter); }
			if (currentLetter == 'y') { currentLetter = 'v'; this.decString.setCharAt(i, currentLetter); }
			if (currentLetter == 'z') { currentLetter = 'w'; this.decString.setCharAt(i, currentLetter); }	
		}
	}
	
	/** Verschlüsselten String ausliefern */
	public StringBuilder getEncryptedString()
	{
		return this.encString;
	}
	
	/** Klartext String aus Chiffre liefern */
	public StringBuilder getDecryptedString()
	{
		return this.decString;
	}
}

Dann noch die actionPerformed-Methoden-Ausschnitt aus Gui-Klasse
Java:
else if ( e.getActionCommand() == "Cäsar-Chiffre")
		{
			// replace statusPanel-Content
			JTextArea jta = new JTextArea();
			jta.setBorder(null);
			jta.setEditable(false);
			jta.setLineWrap(true);
			jta.setWrapStyleWord(true);
			Dimension dim = new Dimension(150, 590);
			jta.setPreferredSize(dim);
			jta.setText(
					"Status: Ort - Kryptographie | Algorithmen | Cäsar"
					);
			
			this.statusPanel.removeAll();
			this.statusPanel.add(jta);
			this.statusPanel.revalidate();
			this.statusPanel.repaint();
			
			// replace centerPanel Content
			this.centerPanel.removeAll();
			JPanel caesarInputPanel = new JPanel();
			JLabel caesarInputHeaderPanelHeader = new JLabel( "Cäsar Chiffre" );
			JTextField caesarInputString = new JTextField( "hier steht eine Zeichenkette");
			
			// die JTextFields ein die Transfercontainer uebergeben
			this.dollarPostStringOne = caesarInputString;
			
			JButton caesarChiffreButtonOne = new JButton("Cäsar-Chiffre entschlüsseln");
			JButton caesarChiffreButtonTwo = new JButton("Cäsar-Chiffre verschlüsseln");
			caesarChiffreButtonOne.addActionListener( this );
			caesarChiffreButtonTwo.addActionListener( this );
			
			
			caesarInputPanel.add(caesarInputHeaderPanelHeader);
			caesarInputPanel.add(caesarInputString);
			caesarInputPanel.add(caesarChiffreButtonOne);
			caesarInputPanel.add(caesarChiffreButtonTwo);
			
			this.centerPanel.add( caesarInputPanel );
			this.centerPanel.revalidate();
			this.centerPanel.repaint();
			
		}
		else if ( e.getActionCommand() == "Cäsar-Chiffre entschlüsseln")
		{
			// replace centerPanel Content
			this.centerPanel.removeAll();
			
			JobaCaesarChiffre jcc = new JobaCaesarChiffre( "decode", this.dollarPostStringOne.getText() );
			
			StringBuilder dencText = jcc.getEncryptedString();
			String eingabeText = this.dollarPostStringOne.getText();
			
			JLabel jldenc = new JLabel();
			jldenc.setText(
					"Der entschlüsselte Text lautet: " + dencText
			);
			
			JLabel jleing = new JLabel();
			jleing.setText("Der Eingabe-String lautet: " + eingabeText );
			
			this.centerPanel.add(jldenc);
			this.centerPanel.add(jleing);
			
			this.centerPanel.revalidate();
			this.centerPanel.repaint();
		}
		else if ( e.getActionCommand() == "Cäsar-Chiffre verschlüsseln")
		{
			// replace centerPanel Content
			this.centerPanel.removeAll();
			
			JobaCaesarChiffre jcc = new JobaCaesarChiffre( "encode", this.dollarPostStringOne.getText() );
			
			StringBuilder encText = jcc.getEncryptedString();
			String eingabeText = this.dollarPostStringOne.getText();
			
			JLabel jlenc = new JLabel();
			jlenc.setText(
					"Der verschlüsselte Text lautet: " + encText
			);
			
			JLabel jleing = new JLabel();
			jleing.setText("Der Eingabe-String lautet: " + eingabeText );
			
			this.centerPanel.add(jlenc);
			this.centerPanel.add(jleing);
			
			this.centerPanel.revalidate();
			this.centerPanel.repaint();
		}
 

Ark

Top Contributor
Strings vergleicht man in 99,9999% aller Fälle mit equals().

Kümmere dich aber nicht nur um das Programmieren, wenn du nicht gerade beim dummen Abtipper bleiben möchtest. Programmierer und Informatiker sind (für meine Begriffe) zwei unterschiedliche Dinge. Darum: finde einen mathematischen und endlich beschreibbaren Zusammenhang zwischen einer Zeichenkette und dem Schlüssel (natürlich sowohl für die Verschlüsselung als auch für die Entschlüsselung).

Ark
 

nO-0n3

Mitglied
Ich würde da gar nicht mit StringBuilder herumspielen macht das ganze nur zu kompliziert.
Du kannst ja auch einfach einen String nehmen (siehe folgendes Beispiel).
Das mit .equals wurde ja schon angesprochen.
Desweitern würde ich noch eine variable key dazunehmen. Also die Anzahl an Stellen um die ein Buchstabe verschoben werden sollte,
dann kannst du das auch jederzeit ändern.
Und wenn du dann noch eine Schleife nimmst für die Erstellung des enc bzw. dec Strings
dann könnte das z.B so aussehen:

Java:
private void computeEncryptedString() {
  encString = new String("");
  boolean upperCase = false;
  
  for(int i = 0;i<inputString.length();i++) {   
  
     char enc = inputString.charAt(i); //Zeichen holen
       
     if(Character.isUpperCase(enc)) upperCase = true; //Großbuchstabe
     else upperCase= false;
       
     enc+=key; // Buchstabe um key verschieben
       
     if(upperCase) { //War Großbuchstabe
        if(enc > 90) //Zu weit => kein Buchstabe mehr
       	   enc-=26;   //da zeichen + key - 26 = wieder von vorne beginnen
     }
     else { //Kleinbuchstabe
        if(enc > 122) 
           enc-=26;
     }
     encString += enc; // Zeichen hinzufügen
  }
}
Funktionieren tut das ganze dadurch das jedes Zeichen einer Zahl entspricht (siehe ASCII Tabelle ->google) somit kannst du sie ganz einfach verschieben.
Das einzige worauf du aufpassen musst ist bei Groß und Kleinschreibung da die Zahlen nicht beisammen liegen.
Analog dazu geht dann auch das decodieren. Probiers mal mit dem Code vielleicht funktioniert dein Programm ja dann.
 
Zuletzt bearbeitet:

0x7F800000

Top Contributor
Das mit der Schleife mach ich mal, wenn das Programm richtig funktioniert - das ist jetzt erstmal das Hauptanliegen, wenn ich dafür 5min länger Copy&Paste machen muss, ist mir das aktuell Wurst.
sicher, dass nicht vielleicht eine Metzgerlehre besser wäre? -.-
;)

Okay, Spaß beiseite:
Java:
			if (currentLetter == 'a') { currentLetter = 'd'; this.encString.setCharAt(i, currentLetter); }
/* 500 km Wurst mit Informationsgehalt=0 */
			if (currentLetter == 'z') { currentLetter = 'c'; this.encString.setCharAt(i, currentLetter); }

/*... 10 zeilen später ...*/

			if (currentLetter == 'a') { currentLetter = 'x'; this.decString.setCharAt(i, currentLetter); }
/*... nochmal die selbe wurst ...*/
			if (currentLetter == 'z') { currentLetter = 'w'; this.decString.setCharAt(i, currentLetter); }	
		}
	}
...erzähl mir jetzt bitte nicht, dass du diese buchstaben per hand eingetippt hättest?!? ;(
Es geht doch nicht um die 5 Minuten copy paste.
Es geht darum, dass du 17000% mehr code gebraucht hast, als nötig :autsch:
Und darum, dass bei dir 5 Minuten völlig monotoner Arbeit keine Wut und keinen inneren Protest auslösen. Das ist schlecht. Beim Programmieren ist nämlich diese Art von "Faulheit" eine der wichtigsten Tugenden, ohne die alle nach wie vor fleißig in Assembler programmieren würden...

Das programm mit 26x-fachen funktionalität (keys unterschiedlicher länge) passt bestens in 22 Zeilen, das sind 4 zeilen weniger, als du für die bekloppten if-abfragen alleine gebraucht hast :eek:
Java:
public class CaesarChiffre {
	public static int mod(int a, int b){
		int r=a%b;
		return r<0?r+b:r;
	}
	public static String encrypt(String text, int key){
		StringBuilder builder=new StringBuilder(text);
		for(int i=0; i<builder.length(); i++){
			builder.setCharAt(i,(char)(mod(builder.charAt(i)-'a'+key,('z'-'a'+1))+'a'));
		}
		return builder.toString();
	}
	public static String decrypt(String text, int key){
		return encrypt(text,-key);
	}
	public static void main(String..._){
		String text="rhabarber";
		System.out.println(text);
		System.out.println(text=encrypt(text,3));
		System.out.println(text=decrypt(text,3));
	}
}
 

Jay1980

Bekanntes Mitglied
Danke für die Anmerkungen,

die ASCII Tabelle kenn ich, ich werde das beim nächsten Mal wohl auch mit dieser Tabelle lösen und dazu Schleifen verwenden, mal schauen, jetzt will ich aber den mir unerklärlichen Fehler schon ausmerzen.
Ich habe aber nun also vor, es mal so zu versuchen, die Anmerkungen zu den Strings haben dazu geführt, dass ich etwas nachgelesen habe und habe entsprechend die Sachen umgeschrieben, also den Vergleich geändert und ich dachte zu sehr ums Eck, dass ich einen veränderbaren String bauen wollte, also die StringBuilder-Klasse genommen habe, aber ich kann ja auch einen normalen String nach und nach mit einem Pluszeichen verlängern. Also nun habe ich normale Strings.

Eins ist aber weiterhin sehr komisch:
* nachdem Click auf 'Cäsar Chiffre entschlüsseln' klappt alles perfekt. Nach einem Klick auf 'Cäsar Chiffre verschlüsseln' ist aus irgendeinem Grund der Ergebnisstring viel länger, obwohl ich beim Betrachten der beiden Methoden keinen Unterschied feststellen kann.

Hier nochmal die Klassen, oben der Ausschnitt aus der actionPerformed Methode und ein Stück weiter unten die:
Java:
// ActionPerformed-Methoden-Ausschnitt
else if ( e.getActionCommand() == "Cäsar-Chiffre")
		{
			// replace statusPanel-Content
			JTextArea jta = new JTextArea();
			jta.setBorder(null);
			jta.setEditable(false);
			jta.setLineWrap(true);
			jta.setWrapStyleWord(true);
			Dimension dim = new Dimension(150, 590);
			jta.setPreferredSize(dim);
			jta.setText(
					"Status: Ort - Kryptographie | Algorithmen | Cäsar"
					);
			
			this.statusPanel.removeAll();
			this.statusPanel.add(jta);
			this.statusPanel.revalidate();
			this.statusPanel.repaint();
			
			// replace centerPanel Content
			this.centerPanel.removeAll();
			JPanel caesarInputPanel = new JPanel();
			JLabel caesarInputHeaderPanelHeader = new JLabel( "Cäsar Chiffre" );
			JTextField caesarInputString = new JTextField( "hier steht eine Zeichenkette");
			
			// die JTextFields ein die Transfercontainer uebergeben
			this.dollarPostStringOne = caesarInputString;
			
			JButton caesarChiffreButtonOne = new JButton("Cäsar-Chiffre entschlüsseln");
			JButton caesarChiffreButtonTwo = new JButton("Cäsar-Chiffre verschlüsseln");
			caesarChiffreButtonOne.addActionListener( this );
			caesarChiffreButtonTwo.addActionListener( this );
			
			
			caesarInputPanel.add(caesarInputHeaderPanelHeader);
			caesarInputPanel.add(caesarInputString);
			caesarInputPanel.add(caesarChiffreButtonOne);
			caesarInputPanel.add(caesarChiffreButtonTwo);
			
			this.centerPanel.add( caesarInputPanel );
			this.centerPanel.revalidate();
			this.centerPanel.repaint();
			
		}
		else if ( e.getActionCommand() == "Cäsar-Chiffre entschlüsseln")
		{
			// replace centerPanel Content
			this.centerPanel.removeAll();
			
			JobaCaesarChiffre jcc = new JobaCaesarChiffre( "decode", this.dollarPostStringOne.getText() );
			
			String dencText = jcc.getDecryptedString();
			String eingabeText = this.dollarPostStringOne.getText();
			
			JLabel jldenc = new JLabel();
			jldenc.setText(
					"Der entschlüsselte Text lautet: " + dencText
			);
			
			JLabel jleing = new JLabel();
			jleing.setText("Der Eingabe-String lautet: " + eingabeText );
			
			this.centerPanel.add(jldenc);
			this.centerPanel.add(jleing);
			
			this.centerPanel.revalidate();
			this.centerPanel.repaint();
		}
		else if ( e.getActionCommand() == "Cäsar-Chiffre verschlüsseln")
		{
			// replace centerPanel Content
			this.centerPanel.removeAll();
			
			JobaCaesarChiffre jcc = new JobaCaesarChiffre( "encode", this.dollarPostStringOne.getText() );
			
			String encText = jcc.getEncryptedString();
			String eingabeText = this.dollarPostStringOne.getText();
			
			JLabel jlenc = new JLabel();
			jlenc.setText(
					"Der verschlüsselte Text lautet: " + encText
			);
			
			JLabel jleing = new JLabel();
			jleing.setText("Der Eingabe-String lautet: " + eingabeText );
			
			this.centerPanel.add(jlenc);
			this.centerPanel.add(jleing);
			
			this.centerPanel.revalidate();
			this.centerPanel.repaint();
		}

--------------------------------------------------------------------------------

public class JobaCaesarChiffre 
{
	private String inputString;
	private String encString;
	private String decString;
	
	/** Konstruktor */
	JobaCaesarChiffre( String flag, String instr )
	{
		this.inputString = instr;
		
		if ( flag.equals("encode")) // Strings werden mit equals auf Gleicheit vergleichen
		{
			this.computeEncryptedString();
		}
		
		if ( flag.equals("decode"))
		{
			this.computeDecryptedString();
		}
		
	}
	
	/** Chiffre aus Klartext bilden */
	private void computeEncryptedString()
	{
		// Ein Buchstabe muss im Alphabet drei Plätze nach vorn verschoben werden
		// also Klartextzeichen | Chiffrezeichen
		
		this.encString = new String("");
		
		for ( int i = 0; i < this.inputString.length(); i++)
		{ 	
			char currentLetter = this.inputString.charAt(i);
			
			if (currentLetter == 'a') { currentLetter = 'd'; this.encString = this.encString + currentLetter; }
			if (currentLetter == 'b') { currentLetter = 'e'; this.encString = this.encString + currentLetter; }		
			if (currentLetter == 'c') { currentLetter = 'f'; this.encString = this.encString + currentLetter; }
			if (currentLetter == 'd') { currentLetter = 'g'; this.encString = this.encString + currentLetter; }
			if (currentLetter == 'e') { currentLetter = 'h'; this.encString = this.encString + currentLetter; }
			if (currentLetter == 'f') { currentLetter = 'i'; this.encString = this.encString + currentLetter; }
			if (currentLetter == 'g') { currentLetter = 'j'; this.encString = this.encString + currentLetter; }
			if (currentLetter == 'h') { currentLetter = 'k'; this.encString = this.encString + currentLetter; }
			if (currentLetter == 'i') { currentLetter = 'l'; this.encString = this.encString + currentLetter; }
			if (currentLetter == 'j') { currentLetter = 'm'; this.encString = this.encString + currentLetter; }
			if (currentLetter == 'k') { currentLetter = 'n'; this.encString = this.encString + currentLetter; }
			if (currentLetter == 'l') { currentLetter = 'o'; this.encString = this.encString + currentLetter; }
			if (currentLetter == 'm') { currentLetter = 'p'; this.encString = this.encString + currentLetter; }
			if (currentLetter == 'n') { currentLetter = 'q'; this.encString = this.encString + currentLetter; }
			if (currentLetter == 'o') { currentLetter = 'r'; this.encString = this.encString + currentLetter; }
			if (currentLetter == 'p') { currentLetter = 's'; this.encString = this.encString + currentLetter; }
			if (currentLetter == 'q') { currentLetter = 't'; this.encString = this.encString + currentLetter; }
			if (currentLetter == 'r') { currentLetter = 'u'; this.encString = this.encString + currentLetter; }
			if (currentLetter == 's') { currentLetter = 'v'; this.encString = this.encString + currentLetter; }
			if (currentLetter == 't') { currentLetter = 'w'; this.encString = this.encString + currentLetter; }
			if (currentLetter == 'u') { currentLetter = 'x'; this.encString = this.encString + currentLetter; }
			if (currentLetter == 'v') { currentLetter = 'y'; this.encString = this.encString + currentLetter; }
			if (currentLetter == 'w') { currentLetter = 'z'; this.encString = this.encString + currentLetter; }
			if (currentLetter == 'x') { currentLetter = 'a'; this.encString = this.encString + currentLetter; }
			if (currentLetter == 'y') { currentLetter = 'b'; this.encString = this.encString + currentLetter; }
			if (currentLetter == 'z') { currentLetter = 'c'; this.encString = this.encString + currentLetter; }	
		}
	}
	
	/** Klartext aus Chiffre bilden */
	private void computeDecryptedString()
	{
		this.decString = new String("");
		
		for ( int i = 0; i < this.inputString.length(); i++)
		{
			char currentLetter = this.inputString.charAt(i);
			
			if (currentLetter == 'a') { currentLetter = 'x'; this.decString = this.decString + currentLetter; }
			if (currentLetter == 'b') { currentLetter = 'y'; this.decString = this.decString + currentLetter; }
			if (currentLetter == 'c') { currentLetter = 'z'; this.decString = this.decString + currentLetter; }
			if (currentLetter == 'd') { currentLetter = 'a'; this.decString = this.decString + currentLetter; }
			if (currentLetter == 'e') { currentLetter = 'b'; this.decString = this.decString + currentLetter; }
			if (currentLetter == 'f') { currentLetter = 'c'; this.decString = this.decString + currentLetter; }
			if (currentLetter == 'g') { currentLetter = 'd'; this.decString = this.decString + currentLetter; }
			if (currentLetter == 'h') { currentLetter = 'e'; this.decString = this.decString + currentLetter; }
			if (currentLetter == 'i') { currentLetter = 'f'; this.decString = this.decString + currentLetter; }
			if (currentLetter == 'j') { currentLetter = 'g'; this.decString = this.decString + currentLetter; }
			if (currentLetter == 'k') { currentLetter = 'h'; this.decString = this.decString + currentLetter; }
			if (currentLetter == 'l') { currentLetter = 'i'; this.decString = this.decString + currentLetter; }
			if (currentLetter == 'm') { currentLetter = 'j'; this.decString = this.decString + currentLetter; }
			if (currentLetter == 'n') { currentLetter = 'k'; this.decString = this.decString + currentLetter; }
			if (currentLetter == 'o') { currentLetter = 'l'; this.decString = this.decString + currentLetter; }
			if (currentLetter == 'p') { currentLetter = 'm'; this.decString = this.decString + currentLetter; }
			if (currentLetter == 'q') { currentLetter = 'n'; this.decString = this.decString + currentLetter; }
			if (currentLetter == 'r') { currentLetter = 'o'; this.decString = this.decString + currentLetter; }
			if (currentLetter == 's') { currentLetter = 'p'; this.decString = this.decString + currentLetter; }
			if (currentLetter == 't') { currentLetter = 'q'; this.decString = this.decString + currentLetter; }
			if (currentLetter == 'u') { currentLetter = 'r'; this.decString = this.decString + currentLetter; }
			if (currentLetter == 'v') { currentLetter = 's'; this.decString = this.decString + currentLetter; }
			if (currentLetter == 'w') { currentLetter = 't'; this.decString = this.decString + currentLetter; }
			if (currentLetter == 'x') { currentLetter = 'u'; this.decString = this.decString + currentLetter; }
			if (currentLetter == 'y') { currentLetter = 'v'; this.decString = this.decString + currentLetter; }
			if (currentLetter == 'z') { currentLetter = 'w'; this.decString = this.decString + currentLetter; }
		}
	}
	
	/** Verschlüsselten String ausliefern */
	public String getEncryptedString()
	{
		return this.encString;
	}
	
	/** Klartext String aus Chiffre liefern */
	public String getDecryptedString()
	{
		return this.decString;
	}
}
 

nO-0n3

Mitglied
Hi!
Also zuerst gleich mal zu deinem Problem.
Angenommen du willst 'a' verschlüsseln:
Es kommt zu der if-Bedingung und setzt currentLetter='d', und fügt ihn dann dem String hinzu. Jetzt kommt currentLetter='d' aber
wieder in eine if-Bedingung wo du diesen auf 'g' setzt usw. Das heißt wenn du nur 'a' verschlüsselt kommt am Ende "dgjmpsvyb" raus.
Das dies beim entschlüsslen nicht passiert ist eher glücksache den es gibt durchaus Kombinationen wo das auch dort auftreten könnte (z.B bei 'a' => "xu").

Am besten verhinderst du das indem du nicht immer currentLetter neu setzt sondern einfach das entsprechende Zeichen dem String hinzufügst.
Noch besser wäre allerdings endlich von dem copy&paste wegzukommen.

Noch zwei Sachen:
Das this. vor jeder Variable innerhalb einer Funkion in deiner Klasse kannst du weglassen macht dort nicht viel Sinn.
Was anderes wäre z.B im Konstruktor wenn du dort gleichnamige Variablen übergeben bekommst.
Und statt this.string = this.string + currentLetter => this.string+=currentLetter macht das ganze nochmal kürzer.
 

Leroy42

Top Contributor
aber ich kann ja auch einen normalen String nach und nach mit einem Pluszeichen verlängern.

Nein!

Du kannst auf keinerlei Art und Weise
einen String in Java verlängern.

Beispiel:

Code:
String text = "Hello " + "world";

erzeugt einen String "Hello world", verlängert aber weder
den String "Hello " noch sonst einen.
 

Jay1980

Bekanntes Mitglied
Danke - nun geht es, ich habe einfach ein continue in jede Zeile geschrieben - jetzt wo es läuft wird auch optimiert, bzw. werde ich die ähnlichen Algorithmen, die Zeichen ersetzen, anders implementieren. Die Anmerkungen eurerseits halfen mir sehr!
 

Jay1980

Bekanntes Mitglied
ROT13 ist ja ganz ähnlich zum Cäsar-Chiffre, man zählt 13 Stellen nach vorne und das habe ich nun so gemacht, nur damit die Tippgeber auch sehen können, dass es nicht immer Copy&Paste sein muss.

Java:
public class JobaRot13 
{

	String inputString;
	String encString;
	String decString;
	String flag;
	
	JobaRot13( String todoflag, String inpString )
	{
		System.out.println("Konstruktor ist da. InpStrin ist zugeteilt: " + inpString);
		inputString = inpString;
		flag = todoflag;
		
		if ( flag.equals("encode"))
		{
			computeEncodeString();
		}
		
		if ( flag.equals("decode"))
		{
			computeDecodeString();
		}
	}
	
	private void computeEncodeString()
	{
		encString = new String("");
		
		// jedes Arrayelement rannehmen
		for ( int i = 0; i < inputString.length(); i++ )
		{
			System.out.println("for-Schleife fürs Array der Buchstaben ist da mit: " + i );
			
			// Ascii Zeichen durchgehen
			// A = 65; B = 66; C = 67; ... Z = 90;
			// a = 97; b = 98; c = 99; ... z = 122;
			
			for ( int j = 97; j < 123; j++)
			{
				
				System.out.println("for-Schleife mit j ist da!");
				
				if ( inputString.charAt(i) == (char)j )
				{
					if ( j + 13 < 123 )
					{
						encString += (char)j;
						System.out.println("Block mit ASCII Zeichen ist da mit: " + j);
						break; // aus der umgebenden Schleife springen
					}
					
					if ( j + 13 > 122 )
					{
						int cj;
						cj = (j + 13) - 26;
						encString += (char)cj;
						System.out.println("Block mit zu grossem ASCII-Zeichen ist da mit: " + cj);
						break;
					}
				}
			}
		}
		
	}
	
	private void computeDecodeString()
	{
		decString = new String("");
		
		// jedes Arrayelement rannehmen
		for ( int i = 0; i < inputString.length(); i++ )
		{
			
			// Ascii Zeichen durchgehen
			// A = 65; B = 66; C = 67; ... Z = 90;
			// a = 97; b = 98; c = 99; ... z = 122;
			
			for ( int j = 97; j < 123; j++)
			{
				if ( inputString.charAt(i) == (char)j )
				{
					if ( j + 13 < 123 )
					{
						decString += (char)j;
						break; // aus der umgebenden Schleife springen
					}
					
					if ( j + 13 > 122 )
					{
						int cj;
						cj = (j + 13) - 26;
						decString += (char)cj;
						break;
					}
				}
			}
		}
	}
	
	public String getEncodeString()
	{
		return encString;
	}
	
	public String getDecodeString()
	{
		return decString;
	}
}
 

nO-0n3

Mitglied
Auf jeden Fall schon viel besser als die copy&paste Blöcke.
Aber das es so noch nicht funktioniert weißt du hoffentlich?^^
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
sserio StringBuilder und Strings Java Basics - Anfänger-Themen 8
W Gleichzeitiges ersetzen mehrerer Strings Java Basics - Anfänger-Themen 7
R Datentypen Das Verhalten von Strings als Datentypen Java Basics - Anfänger-Themen 7
N Nachkommastellen von Strings Java Basics - Anfänger-Themen 3
T Strings unveränderlich???? Java Basics - Anfänger-Themen 22
B Alle Strings bis zu einer Maimallänge aufzählen, die Bedingung erfüllen Java Basics - Anfänger-Themen 13
S Die durchschnittliche Länge der Strings Java Basics - Anfänger-Themen 11
M Operatoren Strings mit Vergleichsoperatoren, funktioniert das? Java Basics - Anfänger-Themen 9
S Variablen Letzte Zeile eines Strings entfernen Java Basics - Anfänger-Themen 1
D Strings aus Excel-Datei einlesen Java Basics - Anfänger-Themen 2
P9cman Tipps für Rekursive Aufgaben mit Strings oder allgemein Java Basics - Anfänger-Themen 2
J Größe eines Strings in Pixel Java Basics - Anfänger-Themen 18
schredder Strings und reguläre Ausdrücke - Methode mit return string.matches Java Basics - Anfänger-Themen 5
B Konkatenieren eines Strings und inkremtierenden Zahl zu einer INT Variablen Java Basics - Anfänger-Themen 7
N Strings verpflechten Java Basics - Anfänger-Themen 4
G Strings auf Gleichheit prüfen - Aufgabe vom Prof. Java Basics - Anfänger-Themen 5
A 2 Strings vergleichen in einer methode wenn man mit Globalen variablen arbeitet Java Basics - Anfänger-Themen 12
L Strings aneinanderhängen Java Basics - Anfänger-Themen 2
M Strings vergleichen Java Basics - Anfänger-Themen 10
Nerdinfekt BMI Rechner, fehler beim Zurückgeben des Strings? Java Basics - Anfänger-Themen 2
U Problem mit dem initialisieren meines Strings in einer Schleife Java Basics - Anfänger-Themen 5
S 2 Strings mit Equals vergleichen Java Basics - Anfänger-Themen 11
Q Besitzen zwei Strings identische Buchstaben, nur in anderer Reihenfolge? Java Basics - Anfänger-Themen 10
marcooooo Separator zwischen allen Zeichen eines Strings einfügen Java Basics - Anfänger-Themen 29
C Ternärer Operator mit Strings Java Basics - Anfänger-Themen 3
M Wie kann ich bei int-Variablen im exception handler auf bestimmte Strings reagieren? Java Basics - Anfänger-Themen 5
P Verketten, Aneinanderreihen von Strings Java Basics - Anfänger-Themen 2
M Strings mit gerader und ungerader Länge ausgeben Java Basics - Anfänger-Themen 10
J Alle Werte eines Strings zusammen addieren Java Basics - Anfänger-Themen 15
W Strings und das parsen Java Basics - Anfänger-Themen 8
D Frage zu Strings einer Exception Java Basics - Anfänger-Themen 4
D Vergleichen von Strings Java Basics - Anfänger-Themen 6
M Konkatenation von zwei Strings Java Basics - Anfänger-Themen 6
J Abbruchbedingung in Schleife/ Untersuchung von Strings Java Basics - Anfänger-Themen 2
S Buchstaben in Großbuchstaben (Strings) Java Basics - Anfänger-Themen 5
X Anagramm mit Strings und Methode Java Basics - Anfänger-Themen 53
P geschachtelte Schleife mit Strings Java Basics - Anfänger-Themen 2
P Strings mit der Axt zerteilen Java Basics - Anfänger-Themen 7
F Alle Zeichenkombinationen eines Strings iterativ herausfinden Java Basics - Anfänger-Themen 26
K Strings hochzählen Java Basics - Anfänger-Themen 20
J Strings untereinander in einer Liste vergleichen Java Basics - Anfänger-Themen 18
B Frage zu: String... strings -> Ungleiche Anzahl an Parameter? Java Basics - Anfänger-Themen 4
F Vergleiche mit charAt funktioniert bei Strings nicht, was tun? Java Basics - Anfänger-Themen 5
T Probleme mit Strings Java Basics - Anfänger-Themen 6
J Unveränderbarkeit von Strings Java Basics - Anfänger-Themen 3
O Klammerung bei Strings Java Basics - Anfänger-Themen 10
A Liste aus drei Strings erstellen Java Basics - Anfänger-Themen 5
N Zwei Strings mit "==" vergleichen warum TRUE Java Basics - Anfänger-Themen 2
G Teil(e) eines Strings entfernen wenn spezifische Zeichen (< & >) vorkommen Java Basics - Anfänger-Themen 5
D ergebnis.matches("[1-9]?[0-9].[0-9][0-9]?") ein teil eines größeren Strings Java Basics - Anfänger-Themen 12
J Breite eines Strings bestimmen Java Basics - Anfänger-Themen 4
D Zwei Strings sind gleich bei if aber nicht true Java Basics - Anfänger-Themen 2
F JList Elemente mit Strings vergleichen Java Basics - Anfänger-Themen 12
J Strings sind gleich werden aber ungleich ausgewertet Java Basics - Anfänger-Themen 2
N Vergleich von Strings schlägt fehl.. Java Basics - Anfänger-Themen 5
B 4 Strings, Anfangsbuchstaben muss unterschiedlich sein Java Basics - Anfänger-Themen 12
P Strings in String Array schreiben Java Basics - Anfänger-Themen 13
J Input/Output Strings aneinander reihen mit while schleife Java Basics - Anfänger-Themen 25
B mir nur die Gesamtzahl von einzigartigen Strings aus Array ausgeben lassen Java Basics - Anfänger-Themen 5
R Erste Schritte Sicheres einlesen eines Strings Java Basics - Anfänger-Themen 2
F Maximale Länge eines Strings Java Basics - Anfänger-Themen 5
J Best Practice Datum Differenz aus zwei Strings ermitteln Java Basics - Anfänger-Themen 8
Jinnai4 Strings ersetzen Java Basics - Anfänger-Themen 9
R Übergeben eines Array Strings an einen Spinner Java Basics - Anfänger-Themen 4
L Rekursiv zwei Strings vergleichen Java Basics - Anfänger-Themen 3
L Prüfe, ob die im String Array enthaltenen Strings aufsteigend sind. Java Basics - Anfänger-Themen 19
J Algorithmus - Strings auf eigene Reihenfolge miteinander vergleichen Java Basics - Anfänger-Themen 4
DaCrazyJavaExpert Variablen Zahlen aus Strings auslesen Java Basics - Anfänger-Themen 4
C 2 Strings Java Basics - Anfänger-Themen 15
T befehle unterschiedlicher anzahl an strings wiedergeben Java Basics - Anfänger-Themen 2
JavaNewbie2.0 Strings in andere Klassen importieren. Java Basics - Anfänger-Themen 2
D BlueJ Java: Strings voneinander trennen Java Basics - Anfänger-Themen 11
javaerd Wie kann ich Brute Force Methode mit Strings erweitern Java Basics - Anfänger-Themen 1
R Erste Schritte Strings "einrücken" Java Basics - Anfänger-Themen 3
Yamie ArrayList<Object> als Liste von Strings ausgeben? Java Basics - Anfänger-Themen 15
B gemeinsames Vorkommen der charactere von 2 Strings als String zurückgeben Java Basics - Anfänger-Themen 5
R Teilinhalt eines Strings testen Java Basics - Anfänger-Themen 10
H Erste Schritte JTree: Instanzen einer Klasse speichern oder Namen/Strings... Java Basics - Anfänger-Themen 4
L Werte von Strings ? Java Basics - Anfänger-Themen 1
L Strings und Arrays - Expand Java Basics - Anfänger-Themen 12
I Schachbrett aus beliebigen Strings erstellen Java Basics - Anfänger-Themen 3
Syncopated Pandemonium Verketten von Strings funktioniert nicht Java Basics - Anfänger-Themen 4
F Wahrscheinlichkeit von Strings Java Basics - Anfänger-Themen 3
MiMa Splitten eines Strings Java Basics - Anfänger-Themen 5
T Hashfunktion für Strings Java Basics - Anfänger-Themen 3
C Zeilenumbruch für langes Strings Java Basics - Anfänger-Themen 2
J Variablen Strings mit Zeilenumbrüchen in neues Array Element Java Basics - Anfänger-Themen 1
T Datentypen compareTo() u. equals() bei Strings Java Basics - Anfänger-Themen 3
H Strings vergleichen & sortieren Java Basics - Anfänger-Themen 20
H Erste Schritte Längstes Wort eines Strings herausfinden Java Basics - Anfänger-Themen 7
D Problem beim umwandeln eines Strings in eine Dzezimalzahl Java Basics - Anfänger-Themen 6
G Strings mit Scanner (nextLine) einlesen Java Basics - Anfänger-Themen 7
T Strings ersetzen mit \ Java Basics - Anfänger-Themen 10
K Strings bearbeiten Java Basics - Anfänger-Themen 14
N Bestimmte Zeichen eines Strings umwandeln Java Basics - Anfänger-Themen 4
L Java Strings Buchstaben vertauschen Java Basics - Anfänger-Themen 4
L Strings in einem JOptionPane farbig Java Basics - Anfänger-Themen 2
A Wie bekomme ich zwei Strings in eine ArrayList Java Basics - Anfänger-Themen 4
C Chars eines Strings mit for schleife rückwärts auslesen Java Basics - Anfänger-Themen 8
J Buchstabe (char) an zufällige Position eines Strings einfügen Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben