Palindrom

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • 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


    Java-Quellcode

    1. import java.util.Stack;
    2. public class Palindrom {
    3. char []arr; // Hilfsarray
    4. Stack<Character> meinStack = new Stack<Character>(); // Stack zum vergleichen
    5. public Palindrom(String wort){ // Constructor
    6. arr = wort.toCharArray(); // zerlegt eingegebenen String in Chars und legt es in das Hilfsarray
    7. for( int i=0; i < arr.length; i++){ // for schleife durchläuft das array
    8. //und legt einzelne Chars in den Stack
    9. meinStack.push(arr[i]);
    10. }
    11. }
    12. //public char[] stringToArrays(String wort){
    13. //char[] arr = wort.toCharArray();
    14. //return arr;
    15. //}
    16. // Methoden Stummgeschalten da in Constructor zusammengefasst
    17. //public void pushStack(char[] arr){
    18. //for( int i=0; i < arr.length; i++){
    19. //meinStack.push(arr[i]);
    20. //}
    21. //}
    22. public boolean vergleichen(Stack<Character> meinstack, char[] arr){
    23. int i=0; // Methode vergleicht die einzelnen Chars des Stacks mit denen des Arrays
    24. while(meinstack.pop().equals(arr[i]) & i<arr.length){
    25. i++;
    26. }
    27. if (meinstack.empty()){ // Falls Stack empty muss Palindorm sein da sonst abbruch
    28. // desahalb ausgabe "Das wort ist ein Palindrom"
    29. System.out.println("Das wort ist ein Palindrom");
    30. return true;
    31. }
    32. else // Falls Stack nicht leer kein Palindrom deshalb "Das wort ist kein Palindrom"
    33. System.out.println("Das wort ist kein Palindrom");
    34. return false;
    35. }
    36. }
    Alles anzeigen


    Test Klasse: Palindromtest

    Quellcode

    1. public class Palindromtest {
    2. public static void main (String []args){
    3. String wort= Console.readString("Bitte geben sie ein wort ein !");
    4. Palindrom String = new Palindrom(wort);
    5. }
    6. }


    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
  • Danke Bennybunny für deine Antwort.... aber daran dachte ich natürlich auch schon das problem ist das

    Quellcode

    1. String.vergleichen(meinstack, arr);

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

    Quellcode

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

    Quellcode

    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 ?
  • 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.
    Bilder
    • Palindrom.png

      71,31 kB, 691×371, 3.323 mal angesehen
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • 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:

    Quellcode

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

    Allerdings ist dann z.B "MaoaM" ein Palindrom, aber "Maoam" ist keins..
  • Commander Perkins schrieb:

    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:

    Quellcode

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

    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...
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • 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:

    Quellcode

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


    Ließt Stack aus und vergleicht:

    Quellcode

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


    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 :(

    Quellcode

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

    Quellcode

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

    @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..
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • 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 :

    Java-Quellcode

    1. import java.util.Stack;
    2. public class Palindrom {
    3. char[] arr; // Hilfsarray um String zu zerlegen
    4. Stack<Character> meinStack = new Stack<Character>(); // Stack zum
    5. // vergleichen
    6. public Palindrom(String wort) { // Constructor
    7. wort = wort.toLowerCase(); // wandelt kompletten String in Kleinbuchstaben um
    8. // da sonst Fehler wenn Großbuchstaben im String vorkommen
    9. arr = wort.toCharArray(); // zerlegt eingegebenen String in Chars und
    10. // legt es in das Hilfsarray
    11. for (int i = 0; i < arr.length; i++) { // for schleife durchläuft das
    12. // array
    13. // und legt einzelne Chars in den Stack
    14. meinStack.push(arr[i]);
    15. }
    16. }
    17. // public char[] stringToArrays(String wort){
    18. // char[] arr = wort.toCharArray();
    19. // return arr;
    20. // }
    21. // Methoden Stummgeschalten da in Constructor zusammengefasst!
    22. // public void pushStack(char[] arr){
    23. // for( int i=0; i < arr.length; i++){
    24. // meinStack.push(arr[i]);
    25. // }
    26. // }
    27. public boolean vergleichen() { // Methode vergleicht die einzelnen Chars des
    28. // Stacks mit denen des Arrays
    29. int i = 0; // Index des Arrays
    30. while (!meinStack.empty()) { // Abbruchbedingung
    31. // durchläuft den Stack und vergleicht es mit den Chars des Arrays
    32. if (meinStack.pop().equals((arr[i]))) { // wenn diese Gleich sind wird Array index hochgezählt
    33. i++;
    34. } else { // wenn Chars nicht gleich dann break
    35. break;
    36. }
    37. }
    38. if (meinStack.empty()) // wenn meinStack leer dann muss Palindrom da kein break return true
    39. return true;
    40. else
    41. return false; // falls meinStack nicht leer dann break also kein Palindrom
    42. }
    43. }
    Alles anzeigen


    Bin trotzdem noch für Verbesserungen offen!


    viele Grüße