# Palindrom mit Groß & kleinbuchstaben



## Moppel (11. Dez 2007)

hi mein Programm soll auf Palindrome testen was es jedoch nur bei Wörtern macht die komplett aus kleinen oder komplett aus großen Buchstaben bestehen. Wie bekomm ich es hin das es auch für Wörter mit Groß-& Kleinbuchstaben funktioniert???

THX





```
public class palindrom {
  public static void main (String args[] ) {
    for(int i=0; i<args.length; i=i+1) {
      boolean b;
        b = new palindrom().istPalindrom(args[i]);
      System.out.println(args[i]+" ist "+(b ? "" : "kein ")+"Palindrom");
    }
  }

  public boolean istPalindrom(String s) {
    int laenge = s.length();
    if(laenge==0) return true;

    for(int i=0; i<laenge/2; i=i+1)
      if(s.charAt(i) != s.charAt(laenge-i-1))
        return false;
    return true;
  }
}
```


----------



## ARadauer (11. Dez 2007)

ich würd da nicht lange umscheißen: ( :bloed: für die ausdrucksweise)
b = new palindrom().istPalindrom(args_.toUpperCase()); 

alles groß und aus  _


----------



## SlaterB (11. Dez 2007)

s = s.toLowerCase();

oder bei den Buchstaben einen Unterschied von x erlauben
(schaue dir die Abstände der chars an)


----------



## Moppel (11. Dez 2007)

danke schön haut so hin


----------



## Cobrus (14. Dez 2007)

Hallo, 

welche Änderung müsste ich bei obigem Code vornehmen, damit ich nicht für jeden Schleifendurchlauf eine Ausgabe bekomme? Ich habe es mit System.out.println am Ende des Programmes versucht, erhalte aber jedesmal die Nachricht, das b noch nicht initialisiert ist.

Hat auch jemand ein Idee, wie ich es angehe, dass mir jedes Palindrom aus einem Satz/Text beliebiger Länge herausgesucht wird?


Gruß,
Cobrus


----------



## Prusik (15. Dez 2007)

du musst 

```
boolean b;
```

vor der Schleife deklarieren (vor die Schleife kopieren)
und danach die Ausgabe aus der Schleife... die Variablen gelten jeweils nur im Block (zwischen {}) in dem sie deklariert wurden...


----------



## Cobrus (16. Dez 2007)

Die Initialisierung von b vor der Schleife ist schon klar. Es funktioniert trotzdem nicht, wie gewünscht. Der System.out.print läuft für jedes Zeichen durch, was bei Texten irgendwann unübersichtlich wird und die Dialogbox mecker, dass b nicht initialisiert ist.

Mein Code ist folgender:


```
public static void main(String[] args) {
    
  public static boolean Palindrom (String text) {
    
    text = text.toLowerCase().replaceAll(" ","").replaceAll(".","");
    
    if (text.contains("?")==true)
      text = text.replaceAll("?","");
    
    int länge = text.length();
    if(länge == 1)
      return true;
     
    for(int i = 0; i < länge/2; i++)
      if(text.charAt(i) != text.charAt(länge-i-1))
        return false;
    return true;    


  public static void main(String[] args) {

    String text = "Ein Esel lese nie.";
    boolean b; 
    
    for(int i=0; i<text.length(); i++) {
      b = class.Palindrom(text);
      System.out.println("Ihre Eingabe '" + text + "' ist " + (b ? "" : "k")+ "ein Palindrom");
    }
    
    JOptionPane.showMessageDialog(null,
      "Ihre Eingabe '" + text + "' ist " + (b ? "" : "k")+ "ein Palindrom",
      "Box 2", JOptionPane.INFORMATION_MESSAGE);
  }
  
}
```


Gruß
Cobrus


----------



## maki (16. Dez 2007)

```
for(int i=0; i<text.length(); i++) {
      b = class.Palindrom(text);
      System.out.println("Ihre Eingabe '" + text + "' ist " + (b ? "" : "k")+ "ein Palindrom");
    }
```
Das ist ja mal 'ne seltsame Schleife.

Brauchst du die wirklich? Las sie doch mal weg  


```
b = Palindrom(text);
      System.out.println("Ihre Eingabe '" + text + "' ist " + (b ? "" : "k")+ "ein Palindrom");
```

Nachtrag: Solltest dich besser an die java Codeconventions halten.

Die Methode Palindrom sollte isPalindrom heissen.


----------



## Cobrus (17. Dez 2007)

> Das ist ja mal 'ne seltsame Schleife



Ehrlich gesagt, war die nur da drin, weil sie in Moppels code enthalten war. Das Prinzip des Programmes habe ich noch nicht vollständig für mich erschließen können. 

So wie es jetzt da steht funktioniert es auch noch nicht richtig. :roll: Die Ergänzung, dass es Sonderzeichen entfernen soll, stört in der momentanen Ausführung:


```
public static boolean Palindrom (String text) {
   
    text = text.toLowerCase().replaceAll(" ","").replaceAll(".","");
   
    if (text.contains(",")==true)
      text = text.replaceAll(",","");
    if (text.contains("?")==true)
      text = text.replaceAll("?","");
    if (text.contains("!")==true)
      text = text.replaceAll("!","");
    if (text.contains(";")==true)
      text = text.replaceAll(";","");
    if (text.contains(":")==true)
      text = text.replaceAll(":","");
    if (text.contains("'")==true)
      text = text.replaceAll("?"'"");
```

Wenn ich die Sonderzeichen nicht berücksichtige, wird ein Satz wie "O Genie, der Herr ehre dein Ego!" nicht als Palindrom anerkannt werden. Im derzeitigen Zustand sieht das Programm aber auch in Worten wie Hund und Auto ein Palindrom. Kann mir da jemand einen Ansatz geben, wie ich das am besten vermeide?

Hat auch jemand ein Idee, wie ich es angehe, dass mir jedes Palindrom aus einem Satz/Text beliebiger Länge herausgesucht wird?

Was hat es mit dieser Konvention auf sich? Warum muss ich den Namen meiner Variable länger machen als unbedingt nötig?  ???:L


----------



## maki (17. Dez 2007)

Warum prüfst du erst bevor du die Satz- und Sonderzeichen entfernst? Performance???
Lass die Prüfung 



> Was hat es mit dieser Konvention auf sich?


Es gibt einen quasi Standard, die Java Code conventions.
Wenn man sich daran hält, ist es auch für andere leihter deinen Code zu lesen und die Namen sind dadurch aussagekräftiger.



> Warum muss ich den Namen meiner Variable länger machen als unbedingt nötig? icon_scratch.gif


Länger als unbedingt nötig? Wolltest du 2 Chars sparen? 

Mit einer richtigen IDE tippst du den namen nur ein einziges mal komplett, da ist es wirklich egal ob Variablennamen länger sind als 10 Buchstaben, die Zeiten als man kurze Namen bevorzugt hat und Speicherplatz teuer war (70'er Jahre) sind vorbei!

Heute kommt es auf die Aussagekraft des Codes an sich an, Kommentare sind verpönt.

zB sSollten Methoden welche einen boolean zurückliefern, mit "is.." anfangen, Klassennamen immer Groß anfangen, Methoden und packages immer klein etc.


----------



## Cobrus (17. Dez 2007)

> Warum prüfst du erst bevor du die Satz- und Sonderzeichen entfernst? Performance???
> Lass die Prüfung



Das war auch mein anfängliches Vorhaben, aber bei mehr als " " und "." in einer Reihe kriege ich nach dem Compilieren und der Texteingabe folgende Fehlermeldung: Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '?' near Index 0.
Die erste Idee sah so aus: 


```
text = text.toLowerCase().replaceAll(" ","").replaceAll(".","").replaceAll(",","").replaceAll("!","").replaceAll("?","")
.replaceAll("'","").replaceAll(";","").replaceAll(":","");
```



> Wenn man sich daran hält, ist es auch für andere leihter deinen Code zu lesen und die Namen sind dadurch aussagekräftiger.
> zB Sollten Methoden welche einen boolean zurückliefern, mit "is.." anfangen, Klassennamen immer Groß anfangen, Methoden und packages immer klein etc.



Okay, werde schauen, dass ich mich in Zukunft daran halte.


----------



## maki (17. Dez 2007)

> Das war auch mein anfängliches Vorhaben, aber bei mehr als " " und "." in einer Reihe kriege ich nach dem Compilieren und der Texteingabe folgende Fehlermeldung: Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '?' near Index 0.


Bestimmte Zeichen sind Sonderzeichen für die RegEx.

Da du sowieso nur character ersetzt und nicht ganze String/RegEx, kannst du auch die Methode replace(..) verwenden, ersetzt halt die Zeichen mit nem Leerzeichen.

Oder du bleibst bei den RegEx, aber dann musst du die Sonderzeichen (?, etc) maskieren.


----------



## Cobrus (17. Dez 2007)

Hmm, mit replace funktioniert es. Keine Probleme mehr oder zumindest finde ich sie gerade nicht.   
Du weißt nicht zufällig auch, wie ich es angehe, um mir jedes Palindrom aus einem Satz/Text beliebiger Länge anzeigen zu lassen, oder?

Mal eine Verständnisfrage: replace bedeutet doch, dass immer nur das erste gefundene Zeichen ersetzt wird, während replaceAll alle Zeichen umsetzt?


----------



## maki (17. Dez 2007)

> Du weißt nicht zufällig auch, wie ich es angehe, um mir jedes Palindrom aus einem Satz/Text beliebiger Länge anzeigen zu lassen, oder?


Auf Anhieb nicht, das hört sich nach einem Algo an der ganze Texte durchsucht 



> Mal eine Verständnisfrage: replace bedeutet doch, dass immer nur das erste gefundene Zeichen ersetzt wird, während replaceAll alle Zeichen umsetzt?
> Nach oben


Doku lesen hilft 
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html#replace(char,%20char)


----------



## Cobrus (17. Dez 2007)

> Auf Anhieb nicht, das hört sich nach einem Algo an der ganze Texte durchsucht



Schade. Aber trotzdem danke erstmal für die Hilfe.



> Doku lesen hilft



Das ist richtig. Mehrmals lesen hilft auch. Ich hatte es mir falsch eingeprägt.


----------



## Cobrus (9. Jan 2008)

Hab auf Basis von Moppls Code mal einen Algorithmus gebastelt, der einen längeren Text auf Palindrome untersucht.

Wer Lust und Laune hat schaue doch bitte mal drüber. Tät mich interessieren, ob es irgendwelche Probleme damit gibt oder was man evtl. kürzer machen könnte.


```
public static void main (String [] args) {
    
  String text = "Hier Text eingeben.";
    
  text = text.toLowerCase().replace(".","").replace(",","").replace("?","").replace("!","").
       replace(";","").replace(":","").replace("'","").concat(" ");

  int durchlauf = 0;
      //Diese Variable läuft den Text durch.
  int wortAnfang = 0;
      /*Diese Variable springt in Abhängigheit von durchlauf durch den Text und
        stellt die Indizes für die einzelnen Wortanfänge dar.*/

  while (durchlauf < text.length()) {
      //while-Schleife, da die Länge der Worte unbekannt ist
        
    if (text.charAt(durchlauf) == ' ') {
      //Wird ein Leerzeichen getroffen, wird der bisherige Textteil als eigenständiger String untersucht. 
      String teil = text.substring(wortAnfang, durchlauf);
            
      int länge = teil.length();
      if(länge == 1)
        System.out.println("Das Zeichen '" + teil + "' ist ein Palindrom.");
           
        boolean b = true;
            
        for(int i = 0; i < länge/2; i++) {
          if(teil.charAt(i) != teil.charAt(länge-i-1)) 
            b = false;
          
        System.out.println("Das Wort '" + teil + "' ist " + (b ? "" : "k") + "ein Palindrom.");
        }
          
      wortAnfang = durchlauf + 1;
      /*Erst wenn ein Leerezeichen erreicht wurde, wird die Variable geändert und als Anfang
        des nächsten substrings definiert*/
          
    }
        
    durchlauf++;
      //Normales Weiterzählen der Variable.
  }
 
}
```


----------



## Guest (11. Jan 2008)

Cobrus hat gesagt.:
			
		

> Hat auch jemand ein Idee, wie ich es angehe, dass mir jedes Palindrom aus einem Satz/Text beliebiger Länge herausgesucht wird?


1. Großbuchstaben in Kleinbuchstaben umwandeln
2. Alle Zeichen, die kein Kleinbuchstabe sind, entfernen
3. neuen, gespiegelten String erzeugen
4. schauen, ob Original und Spiegelung gleich sind


```
public class Palindrom
{
	public static void main(String args[])
	{
		for (String arg: args)
		{
			System.out.println(arg + " ist "
					+ (istPalindrom(arg) ? "" : "k") + "ein Palindrom");
		}
	}

	public static boolean istPalindrom(String s)
	{
		String t = s.toLowerCase().replaceAll("[^a-z]", "");
		return t.equals(new StringBuilder(t).reverse().toString());
	}
}
```

Beispielaufruf:


java Palindrom Test Otto "O Genie, der Herr ehre dein Ego!"

Test ist kein Palindrom
Otto ist ein Palindrom
O Genie, der Herr ehre dein Ego! ist ein Palindrom


Fred


----------



## Cobrus (11. Jan 2008)

> 1. Großbuchstaben in Kleinbuchstaben umwandeln


Richtig, habe ich vergessen mit anzugeben. Ohne klappts natürlich nicht.



> 2. Alle Zeichen, die kein Kleinbuchstabe sind, entfernen


Jupp, ist drin.



> 3. neuen, gespiegelten String erzeugen
> 4. schauen, ob Original und Spiegelung gleich sind


Das ist eine interessante Methode. Werde ich im Hinterkopf behalten.

Kannst Du mir evtl. die Bedingung der for-Schleife etwas näher erläutern? Das verstehe ich nicht so ganz.


Gruß,
Cobrus


----------



## Guest (11. Jan 2008)

die bedingung der for-schleife?

```
for (String arg: args)
      {
         System.out.println(arg + " ist "
               + (istPalindrom(arg) ? "" : "k") + "ein Palindrom");
      }
```

du hast als input ja nen string-array (args[]). und für jedes element darin wird die schleife ausgeführt. in der schleife wird das element dann als String arg angesprochen.


----------



## Guest (11. Jan 2008)

Cobrus hat gesagt.:
			
		

> Kannst Du mir evtl. die Bedingung der for-Schleife etwas näher erläutern? Das verstehe ich nicht so ganz.


Das ist die sog. "erweiterte for-Schleife", eingeführt mit Java 5. Folgender Code

```
for (type element : collection) statement
```
iteriert einfach über alle Elemente einer Sammlung, die Du dann in der Anweisung jeweils mit dem vergebenen Namen ("element") ansprechen kannst.


Fred


----------

