[Java] Palindrome

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von allstar, 12. November 2010 .

Schlagworte:
Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 12. November 2010
    Palindrome

    hey leute, ich bin gerade dabei ein programm zu coden, bei dem ich die chars eines wortes in ein array initialisiere und das mir dann angibt ob es sich bei dem wort um ein palindrom handelt.

    es sieht im moment so aus:
    PHP:
    public class  palindrom {
    public static 
    void main ( String [] args ){

    char []  wort ={ 'l' , 'a' , 'g' , 'e' , 'r' , 'r' , 'e' , 'g' , 'a' , 'l' };
    int a = 0 ; //linke grenze des arrays
    int b = wort . length - 1 ; //rechte grenze des arrays
    boolean palindrom = true ;

    while(
    a < wort . length / 2 ){
      if(
    wort [ a ]== wort [ b ]){
        
    a ++;
        
    b --;
      
    }
    palindrom = true ;

    }if(
    palindrom ){
    System . out . println ( "Dieses Wort ist ein Palindrom" );
    }
    else
    System . out . println ( "Dieses Wort ist ein Palindrom" );
    }
    }

    das problem ist, wenn es ein palindrom ist, dann wird es mir auch als palindrom angegeben. wenn ich jetzt aber ein wort initialisiere das kein palindrom ist, dann compiliert er zwar, aber er startet das progamm dann erst gar nicht.


    ich vermute das hat mit meiner verwendung der boolean werte zu tun, aber ich weiss nicht wie.


    mfg allstar
     
  2. 12. November 2010
    AW: Palindrome

    Dein Quellcode macht ja auch wenig Sinn.

    Code:
    if(wort[a]==wort[b]){ 
    
    allein wenn sich der erste und der letzte Buchstabe unterscheiden hast du schon eine Endlosschleife

    mal abgesehen davon, dass es ein Einzeiler ist ein Palindrom zu testen
     
  3. 12. November 2010
    AW: Palindrome

    danke schon mal, hast du einen vorschlag wie ich das ändern könnte? oder sollte ich mir direkt ein anderes konzept überlegen?



    mfg allstar?
     
  4. 12. November 2010
    AW: Palindrome

    nein das Konzept an sich ist ja in Ordnung.

    nur die While-Schleife und die darin enthaltende If Abfrage macht so wenig Sinn.

    ich würde das eher so machen

    vor der while schleife die bool auf true
    während der while schleife testen ob wort[a]!=wort, wenn dann die bool = false

    dann sollte es klappen

    und das a++ und b-- auf keinen fall in die if rein
     
  5. 12. November 2010
    AW: Palindrome

    ich würde das so machen, ist mmn. einfacher

    Code:
    public class Palindrom
    {
     public static void main(String[] args)
     {
     String wort = "lagerregal";
     int length = wort.length();
     
     // prüfung auf gerade länge möglw. fasch
     
     int half = (int) (length / 2);
     
     // splitten
     String part1 = wort.substring(0, half);
     String part2 = wort.substring(half);
     
     // part2 umdrehen
     StringBuilder builder = new StringBuilder();
     for(int i = half - 1; i >= 0; --i)
     builder.append(part2.charAt(i));
     
     part2 = builder.toString();
     
     if(part1.equals(part2)) {
     System.out.print("palindrom");
     } else {
     System.out.print("kein palindrom");
     }
     
     }
    } 
     
  6. 12. November 2010
    AW: Palindrome

    Ich würde von Innen nach Außen laufen:

    PHP:
    public class  Palindrom  {

        public static 
    void main ( String []  args ) {
            
            
    char []  palindrom  = { 'a' 'n' 'n' 'a' };
            
    System . out . println ( check ( palindrom ));

        }
        
        private static 
    boolean check ( char []  word ){
            
    boolean correct  true ;
            
            
    int a b ;
            
            if (
    word . length  ==  0 ) {
                
    word . length  1 ;
                
    1 ;
            } else {
                
    word . length  1 ;
                
    2 ;
            }
            
            while (
    >=  &&  word . length  &&  correct )
                if (
    word [ a --] !=  word [ b ++])
                    
    correct  false ;    
            
            return 
    correct ;
        }

    }
    @Murdoc: Ich finde meiner Lösung schöner ;-)

    //Edit: Es geht sogar noch kürzer:

    PHP:
    public class  Palindrom  {

        public static 
    void main ( String []  args ) {
            
            
    char []  palindrom  = { 'a' 'n' 'n' 'a' };
            
    System . out . println ( check ( palindrom ));

        }
        
        private static 
    boolean check ( char []  word ){
            
    boolean correct  true ;
            
            
    int a  word . length  1 ;
            
    int b  = ( word . length  ==  0 ) ?  2 ;
            
            while (
    >=  &&  word . length  &&  correct )
                if (
    word [ a --] !=  word [ b ++])
                    
    correct  false ;    
            
            return 
    correct ;
        }

    }
    Zu deinem eigenen Quellcode: Schau dir mal den Teil an - du bekommst eine Endlosschleife, wenn du kein Palindrom eingibst. Wenn du dir meine Version anschaust, findest du den Fehler alleine.

    PHP:
    boolean palindrom = true

    while(
    a < wort . length / 2 ){ 
      if(
    wort [ a ]== wort [ b ]){ 
        
    a ++; 
        
    b --; 
       

    palindrom = true
     
  7. 12. November 2010
    AW: Palindrome

    naja eine lösung hier rein zu hauen isst ja nicht Sinn der Sache

    sondern er soll es ja selbst entwickeln

    ansonsten könnte man ja auch einfach dieses machen
    Code:
    String s = "blaaalb";
     if (s.equalsIgnoreCase(new StringBuilder(s).reverse().toString())) {
     System.out.println("Palindrom!!!!");
     }
    
     
  8. 12. November 2010
    AW: Palindrome

    danke auf jeden fall für die vielen tipps. ich werde aber versuchen meine eigene version zu überarbeiten.
    ich bin nämlich noch am anfang meiner java ausbildung und eure codes enthalten für mich noch teilweise unverständliche befehle.
    der teil mit
    PHP:
      if( length  !=  0 ) {
                
    System . out .print( "kann kein palindrom sein" );
                
    System .exit( 1 );
    ist aber auf jeden fall eine idee die ich bei mir einbauen werde. obwohl es so simpel ist, bin ich nicht selbst darauf gekommen.

    ich poste mal meine version wenn ich sie fertig habe

    10er sind raus

    PS: @Fanatic
    ich gehe beim prüfen von außen nach ihnen, weil ich den algorithmus bei einem reverse array gesehen habe und ich ihn eigentlich sehr elegant finde.


    mfg allstar
     
  9. 13. November 2010
    AW: Palindrome

    Warum sollten nur Strings mit gerader Zeichenanzahl Palindrome sein drüfen?
    Bob und das bekannte Beispiel Reliefpfeiler sind meiner Meinung nach genau so valide Palindrome. Zu dem einzelnen Buchstaben in der Mitte gibt es halt kein Pendant.

    Als ich vor einiger Zeit mal über die Validierung von Palindromen nachgedacht hab, ist eine zu Anqueetus' Code aquivalente Loesung herausgekommen. Ich finde sie kurz, aber verständlich.
     
  10. 13. November 2010
    AW: Palindrome

    Du hattest ja die lösung selbst schon fast, würd also einfach bei der bleiben.

    Dein problem ist folgendes:
    Du überprüfst in der while-schleife nur, ob die beiden positionen wort[a] und wort gleich sind. wenn ja, setzt a und b vor/zurück. sind die werte jetzt nicht gleich, dann machst du garnix und auch a wird nicht umgesetzt -> die bedingung in der while-schleife (a < wort.lengt/2) gilt immer -> das programm ist in ner endlosschleife!

    zur lösung: behandle den fall dass es nicht passt einfach im else der if in der while, bspw. so:
    Code:
    if (wort[a] == wort[b])
    {
     a++;
     b--;
    }
    else
    {
     palindrom = false;
     break; //raushüpfen aus der schleife
    }
    
    das palindrom=true nach dem if brauchst du nicht mehr, du setzt es sowieso von anfang an auf true!
    mit dem break verlässt du die schleife sofort und es wird dir ausgegeben obs n palindrom ist oder nicht. pass aber auf, du hast bei

    Code:
    }if(palindrom){ 
    System.out.println("Dieses Wort ist ein Palindrom"); 
    } 
    else 
    System.out.println("Dieses Wort ist ein Palindrom"); 
    } 
    } 
    
    zwei mal die selbe ausgabe drinnen, da gehört im else-zweig n "Dieses Wort ist ->K<-ein Palindrom" hin.
     
  11. 15. November 2010
    AW: Palindrome

    genau das ist mir im nachhinein dann auch aufgefallen als ich das wort ausprobiert habe^^
    hab den teil auch wieder rausgenommen und soweit fertig mit meinem code.

    PHP:
    httpublic  class  palindrom
    public static 
    void main ( String [] args ){ 

    char []  wort ={ 'r' , 'e' , 'l' , 'i' , 'e' , 'f' , 'g' , 'f' , 'e' , 'i' , 'l' , 'e' , 'r' }; 
    int a = 0 ; //linke grenze des arrays 
    int b = wort . length - 1 ; //rechte grenze des arrays 
    boolean palindrom = true


    while(
    a < wort . length / ){ 
      if(
    wort [ a ]!= wort [ b ]){  //prüft den ersten und letzten char auf gleichheit
        
    palindrom = false ;} 
        
    a ++; 
        
    b --;
    }
     
    if(
    palindrom ){ 

    System . out . println ( "Dieses Wort ist ein Palindrom" ); 

    else 
    System . out . println ( "Dieses Wort ist kein Palindrom" ); 

    }  
    l
    also ich hab es jetzt mit diversen palindromen getestet, unter anderem reliefpfeiler und es kommt immer das richtige raus. ich glaube bis auf ein paar schönheitsfehler und unnötige zeilen ist der code soweit fertig.

    ich hab dann noch zwei fragen.
    1. würde ich gerne wissen wie ich es code, dass ich einen string direkt in einen array speichern kann ohne von hand die einzelnen chars eintippen zu müssen.

    2. muss ich das wort am ende ausgeben und ich kenne bis jetzt nur die umständliche variante mit einer while schleife.

    PHP:
    while( i < arr . lenght ){ System . out .print( arr [ i ]);
    i ++
    }
    es gibt doch aber garantiert einen leichteren weg oder?
     
  12. 16. November 2010
    AW: Palindrome

    Ein kleiner Einwurf von mir:
    Hab jetzt eure Quelltexte mal mehr oder weniger überflogen.
    Wir hatten letztes JAhr auch Java - Ich mische mich jetzt mal nicht ein - ihr könnt das alle sicherlich ein ganzes Stück besser als ich...!
    Nur ist es meiner Meinung nach noch wichtig, dass entweder alle Buchstaben auf groß oder alle auf klein gesetzt werden, da man sonst bei Anna das problem hätte, A != a. Zumindest wars bei uns der Fall.
     
  13. 16. November 2010
    AW: Palindrome

    String foo = "abdcef";
    char[] bar = foo.toCharArray();

    System.out.println(arr);

    Jo, bis auf die Lösung von Anqueetus (equalsIgnoreCase())
     
  14. 16. November 2010
    AW: Palindrome

    Wieso machst du es nicht einfach so ?
    Hier meine Lösung hoffe du kannst damit etwas anfangen

    Code:
    public class PallindromFrame {
     public static void main(String[] args) {
     String str = "reliefpfeiler";
    // String str = "test";
     boolean palli = true;
    
    
    // Hier kommt der Algorithmus rein
     for (int i = 0; i < str.length()/2; i++) {
     if(str.charAt(i)!= str.charAt(str.length()-i-1)){
     palli = false;
     }
    }
     
     
     if (palli)
     System.out.println("'" + str + "' ist ein Palindrom.");
     else
     System.out.println("'" + str + "' ist kein Palindrom.");
     }
    }
     
  15. 16. November 2010
    AW: Palindrome


    genau, danke, das wollte ich auch gerade schreiben, aber hab dann gesehn dass dus schon geschrieben hast

    Genauso der Ansatz von Elobi.
    Und zwar anstatt mit einem Char Array zu arbeiten einfach den Char an einer bestimmten Stelle mit CharAt() zu nehmen.
    Wie man sieht kann man das Problem auf viele Arten lösen und jede hat ihre Vor und Nachteile.
    Wichtig ist aber das du verstehst was du programmierst und wieso das so ist.
    Hast du alles verstanden dann super dann haben wir gute Arbeit geleistet
    Wenn nicht, her mit den Fragen
     
  16. 17. November 2010
    AW: Palindrome

    Hier mal meine Lösung (in C++):

    Code:
    bool Palindrom(const string& str)
    {
     int i = -1;
     int j = str.length();
    
     while (++i < --j)
     if (toupper(str[i]) != toupper(str[j]))
     return false;
    
     return true;
    }
     
  17. 17. November 2010
    AW: Palindrome

    danke nochmal an alle, ich poste hier wie versprochen mein code damit ihr euch mal mein weg anschauen könnte.

    PHP:
    public class  palindrom
    public static 
    void main ( String [] args ){ 

    char []  wort ={ 'r' , 'e' , 'l' , 'i' , 'e' , 'f' , 'g' , 'f' , 'e' , 'i' , 'l' , 'e' , 'r' }; 
    int a = 0 ; //linke grenze des arrays 
    int b = wort . length - 1 ; //rechte grenze des arrays 
    boolean palindrom = true


    while(
    a < wort . length / ){ 
      if(
    wort [ a ]!= wort [ b ]){  //prüft den ersten und letzten char auf gleichheit
        
    palindrom = false ;} 
        
    a ++; 
        
    b --;
    }
     
    if(
    palindrom ){ 

    System . out . println ( "Dieses Wort ist ein Palindrom" ); 

    else 
    System . out . println ( "Dieses Wort ist kein Palindrom" ); 

    }  

    also ich werde da wahrscheinlich noch einige schönheitsfehler ausbessern und vereinfachen, aber im großen und ganzen wird es so bleiben.

    ich close hier mal


    mfg allstar
     
  18. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.