You are not logged in.

  • Login

1

Saturday, April 24th 2010, 5:52pm

Palindrom

Ein herzliches Hallo an alle Java Programmierer!!!

Ich habe hier ein kleines Programm geschrieben was mir sagen soll ob ein eigegenbenes wort ein Palindrom (also von vorn nach hinten und von hinten nach vorn gelesen gleich ist z.b. otto) ist oder nicht das ganze soll mit der Klasse java.util.Stack realisiert werden....
nun soweit so gut habe nun folgenden Code zusamm gezimmert:

Kalsse Palindrom


Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import java.util.Stack;

public class Palindrom {
	
	
	char []arr;									// Hilfsarray 
	Stack<Character> meinStack = new Stack<Character>();  // Stack zum vergleichen 
	
	
	public Palindrom(String wort){				// Constructor
		 arr = wort.toCharArray();				// zerlegt eingegebenen String in Chars und legt es in das Hilfsarray
		for( int i=0; i < arr.length; i++){		// for schleife durchläuft das array 
										//und legt einzelne Chars in den Stack	
			meinStack.push(arr[i]);
		}
	}
	
	//public char[] stringToArrays(String wort){		
		//char[] arr = wort.toCharArray();
		//return arr;
		//}
												// Methoden Stummgeschalten da in Constructor zusammengefasst
	//public void pushStack(char[] arr){
		//for( int i=0; i < arr.length; i++){
			//meinStack.push(arr[i]);
		//}
	//}
	public boolean vergleichen(Stack<Character> meinstack, char[] arr){
		int i=0;									// Methode vergleicht die einzelnen Chars des Stacks mit denen des Arrays 
		while(meinstack.pop().equals(arr[i]) & i<arr.length){
			i++;
			
		}
		if (meinstack.empty()){						// Falls Stack empty muss Palindorm sein da sonst abbruch 
													// desahalb ausgabe "Das wort ist ein Palindrom"
			System.out.println("Das wort ist ein Palindrom");
			return true;
			}
		else 										// Falls Stack nicht leer kein Palindrom deshalb "Das wort ist kein Palindrom"
			System.out.println("Das wort ist kein Palindrom");
			return false;
	}
		
			
	}


Test Klasse: Palindromtest

Source code

1
2
3
4
5
6
7
8
9
10
public class Palindromtest {

	public static void main (String []args){
	
	String wort= Console.readString("Bitte geben sie ein wort ein !");

	Palindrom String = new Palindrom(wort);
	
	}
}


So nun ist das Problem das wenn ich die Testklasse ausführe und z.B. Otto eingebe passiert gar nichts!!!!!!
Finde den Fehler aber nicht kann mir nur denken das entweder die Testklasse falsch ist (Weiß nämlich nicht wie ich das ganze aufrufen soll) oder in der Klasse Palindrom wird irgenwas nicht so übergeben wie ich es mir vorstelle oder aber der vergleich mit equals ist nicht richtig da ich noch gar keinen HashCode implementiert habe muss ich den zwingend implementieren um equals zu nutzen???

ich danke euch im Vorraus für eure Hilfe und hoffe jemand findet den Fehler!

Mit freundlichen Grüßen

the_old_Pirate

2

Saturday, April 24th 2010, 6:49pm

Du solltest die Methode "vergleichen" auch aufrufen, um eine Ausgabe zu erhalten.

3

Saturday, April 24th 2010, 7:44pm

Danke Bennybunny für deine Antwort.... aber daran dachte ich natürlich auch schon das problem ist das

Source code

1
String.vergleichen(meinstack, arr); 

so aussieht und ich keine ahnung habe wie und was ich jetzt nun als arguments einsetzen soll ?
denn

Source code

1
String.vergleichen(otto, otto);
funzt nicht
genau so wenig wie wenn ich die arguments so lasse also :

Source code

1
String.vergleichen(meinstack, arr);
hier sagt er mir das meinstack und arr nicht resolved werden können ist eigentlich schon ein hinweiß darauf das irgenwas nicht übergeben wird oder ?
oder ich steh komplett aufem schlauch gerade ?

4

Sunday, April 25th 2010, 2:24pm

Ich nehme an, dass es eine Aufgabe ist die dir gestellt wurde um das Konzept eines LIFO-Speichers (Stack) zu verstehen. Deswegen würde ich die Aufgabe auch anders lösen, das Stackprinzip hängt sehr stark mit dem Prinzip der Rekursion zusammen. Ich hab mal skizziert wie man das dann lösen würde, alledrings muss noch berücksichtigt werden dass Palindrome mit einer ungeraden Anzahl möglich sind ("Rentner") und damit einen Sonderfall darstellen.
SeBa has attached the following image:
  • Palindrom.png

5

Sunday, April 25th 2010, 2:41pm

Hallo,
Du brauchst Deiner vergleichen-Methode nichts übergeben.
In Deinem Konstruktor werden Dein Stack und dein Array ja erzeugt,
und stehen zur Verfügung.

Die while-Schleife würde ich anders aufbauen:

Java Quellcode

1
2
3
4
......
while(meinStack.size()>0) {
			if(meinStack.pop().equals((arr[i]))) {
.....

Allerdings ist dann z.B "MaoaM" ein Palindrom, aber "Maoam" ist keins..

6

Sunday, April 25th 2010, 2:56pm

Hallo,
Du brauchst Deiner vergleichen-Methode nichts übergeben.
In Deinem Konstruktor werden Dein Stack und dein Array ja erzeugt,
und stehen zur Verfügung.

Die while-Schleife würde ich anders aufbauen:

Java Quellcode

1
2
3
4
......
while(meinStack.size()>0) {
			if(meinStack.pop().equals((arr[i]))) {
.....

Allerdings ist dann z.B "MaoaM" ein Palindrom, aber "Maoam" ist keins..

Dagegen hilft ja equalsIgnoreCase()...

Ich weiß auch nicht wie akademisch das Problem betrachtet werden muss, allerdings ist size() ein Operator der in der Java-Implementierung verfügbar ist, da Stack von Vector erbt. Normalerweise ist das eine untypische Operation für einen Stack, in deinem Fall könnte man das mit empty() besser machen da diese exakt size()>0 entspricht. Hinzukommt, wenn ich das richtig sehe, dass deine Funktion auf die Fresse fliegt, sobald der Stack mehr Zeichen enthält als das Array, und die von the_old_pirate, wenn's andersherum ist...

7

Sunday, April 25th 2010, 3:37pm

Quoted

sobald der Stack mehr Zeichen enthält als das Array

Wie oder wann könnte dieses Szenario denn zutreffen?

8

Sunday, April 25th 2010, 3:49pm

Wenn die öffentliche Methode public boolean vergleichen(Stack<Character> meinstack, char[] arr) mit ungünstigen Parametern aufgerufen wird...

9

Sunday, April 25th 2010, 3:57pm

Ok, das hatte ich nicht bedacht, weil ich die vergleichen-Methode ohne Parameter
aufrufe: public boolean vergleiche()
Dann sollte aber eigentlich nichts schiefgehen oder?

10

Sunday, April 25th 2010, 4:11pm

Hey SeBa und Commander danke für eure Vorschläge :

@SeBa ja du hast recht die aufgabe soll wohl den Sinn haben einen LIFO-Speicher zu verstehen hab mir nun ein paar gedanken zu deiner Skizze gemacht also ich verstehe schon was du mir damit zeigen möchtest du gibst das Wort z.B. Lagerregal ein wobei du nur den ersten Teil Lager einließt schreibst dieses dann in den Stack den du später wieder ausließt nun bekommst du das wort dem Stack sei dank umgedreht raus bei Lager regal müsstest du nun das eingelesene Wort mit dem was du ausdem Stack bekommst zusammbasteln und tata es kommt wieder Lagerregal raus (bei wörtern wie Otto wäre das zusammen fügen sinnlos) so nun müsste ich das doch irgenwie wieder mit einander vergleichen in dem ich das wort vorher in ein Array gespeichert habe oder ? Denke sogar das ich genau das schon getan habe wenn ich deine Skizze richtig verstanden habe :

Ließt in Stack ein:

Source code

1
2
3
4
5
6
7
	public Palindrom(String wort){				// Constructor
		 arr = wort.toCharArray();				// zerlegt eingegebenen String in Chars und legt es in das Hilfsarray
		for( int i=0; i < arr.length; i++){		// for schleife durchläuft das array 
												//und legt einzelne Chars in den Stack	
			meinStack.push(arr[i]);
		}
	}


Ließt Stack aus und vergleicht:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public boolean vergleichen(){
		int i=0;									// Methode vergleicht die einzelnen Chars des Stacks mit denen des Arrays 
		
		while(meinStack.empty())
			i++;
			
													// durchläuft den Stack und vergleicht es mit den Chars des  Arrays 
		if (meinStack.pop().equals((arr[i]))){		// wenn die Gleich sind da ein Palindrom von hinten nach vorn und von vorn nach hinten 
													// die gleichen Chars besitzen muss so wird 
													// Ausgabe "Das wort ist ein Palindrom"
			System.out.println("Das wort ist ein Palindrom");
			return true;
		}
		else 										// Falls Chars nicht gleich mit denen des Arrays kein Palindrom deshalb "Das wort ist kein Palindrom"
			System.out.println("Das wort ist kein Palindrom");
			return false;
	}
		


oder meinst du ich solle eine Rekursive Methode machen die sich selbst immer wieder Aufruft ??? Hier wäre ich über ein kleines Beispiel sehr Dankbar da ich mir das gerate nicht vorstellen kann??

Übrigens funzt equalsIgnoreCase() leider nicht da es nicht für den Typ Char geht sagt mir zumindest eclipse.....

@Commander Danke du hast das Problem echt gelößt wie du siehst habe ich deinen Vorschlag gleich umgesetzt ...naja habe SeBa´s verbesserungen mit eingebaut aber ok nun wäre nur noch das Problem mit Klein und Großbuchstaben zulösen.

Übrigens ist mir auch noch ein dummer Schreibfehler aufgefallen :(

Source code

1
2
3
4
5
6
7
8
9
public boolean vergleichen(Stack<Character> meinstack, char[] arr){
		int i=0;									
		while([u]meinstack[/u].pop().equals(arr[i]) & i<arr.length){
			i++;
			
		}
		if ([u]meinstack[/u].empty()){						
			System.out.println("Das wort ist ein Palindrom");
			return true;


meinstack sollte eigentlich so aussehen meinStack .... das war wohl auch der Grund warum ich nicht einmal einen Compilerfehler bekam da hier weder was übergeben wurden noch das er jemals in diese if abfrage reingelaufen ist ;)

11

Tuesday, April 27th 2010, 8:27pm

Ja sowas in der Art machst du auch, allerdings arbeitest du itereativ und nicht rekursiv, was natürlich genauso geht. Allerdings packst du das ganze Wort erst rein in den Stack und holst es dann Buchstabe für Buchstabe raus. Da es sich um einen LIFO-Speicher handelt ist es dann natürlich andersherum. Du benutzt es letzendlich wie ein Array das du einmal vorwärts und dann wieder Rückwärts durchwanderst. Das kann man machen, macht aber den Stack und den Zusammenhang mit rekusiven Programmieren nicht deutlich.

Zu dein Problem mit dem Groß-/Kleinbuchstaben: Wenn du beide vorher kleinmachst müsse es gehen:

Java Quellcode

1
2
3
..
if (meinStack.pop().toLowerCase().equals((arr[i].toLowerCase()))){
..

@Commander Perkins: Mann sollte bei jedem Arrayzugriff vorher prüfen ob der Index zulässig ist, einfach weil es nichts kostet so eine Exception ein unschönes Programmende ist. Wenn du es nichts machst und später da was änderst findest du den Fehler nur sehr schlecht..

12

Friday, May 7th 2010, 11:25am

Danke für eure Hilfe hab das Programm nun Fertig hab es aber bei der Iterativen Lösung belassen das Ganze Sieht nun so aus :

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import java.util.Stack;

public class Palindrom {

	char[] arr; 											// Hilfsarray um String zu zerlegen
	Stack<Character> meinStack = new Stack<Character>(); 		       // Stack zum
                                                                                                       // vergleichen

	public Palindrom(String wort) { 							// Constructor
		wort = wort.toLowerCase();						        // wandelt kompletten String in Kleinbuchstaben um 
												        // da sonst Fehler wenn Großbuchstaben im String vorkommen 
		
		arr = wort.toCharArray(); 							// zerlegt eingegebenen String in Chars und
													// legt es in das Hilfsarray
		for (int i = 0; i < arr.length; i++) { 				                // for schleife durchläuft das
													// array
													// und legt einzelne Chars in den Stack
			meinStack.push(arr[i]);
		}
	}

	// public char[] stringToArrays(String wort){
	// char[] arr = wort.toCharArray();
	// return arr;
	// }
											// Methoden Stummgeschalten da in Constructor zusammengefasst!
	// public void pushStack(char[] arr){
	// for( int i=0; i < arr.length; i++){
	// meinStack.push(arr[i]);
	// }
	// }

	public boolean vergleichen() { // Methode vergleicht die einzelnen Chars des

										// Stacks mit denen des Arrays
		int i = 0; 								// Index des Arrays

		while (!meinStack.empty()) { 			// Abbruchbedingung

											

												// durchläuft den Stack und vergleicht es mit den Chars des Arrays
			if (meinStack.pop().equals((arr[i]))) { 	// wenn diese Gleich sind wird Array index hochgezählt 
														
				i++;
				
			} else {							// wenn Chars nicht gleich dann break	
				break;
			}

			
		}

		if (meinStack.empty())				// wenn meinStack leer dann muss Palindrom da kein break return true
			return true;
		else
			return false;					// falls meinStack nicht leer dann break also kein Palindrom
	}
}


Bin trotzdem noch für Verbesserungen offen!


viele Grüße

Similar threads

Social bookmarks