# Palindromtester Methode



## Maximaltime (1. Jul 2011)

Hallo zusammen ich würde gerne ein ganz einfaches Palindrom tester programm schreiben, hab nun
alle compiler fehler behoben aber ich bekomm keine Ausgabe.  Wär nett wenn ihr den Fehler finden würdet


```
public class Palindrom{


	public static void main(String[]args){

	String [] Word= {"l","a","g","e","r","r","e","g","a","l"};

	if( Palindromtester (Word)== true){
		System.out.println(" Das Wort Lagerregal ist ein Palindrom");}
}//end main

	public static boolean Palindromtester(String [] w){
		int vorne=0;
		int hinten=w.length;
		int anzElm=w.length+1;

		if (w.length%2 ==1){
		{while(w[vorne]==w[hinten]){
			anzElm=anzElm-2;
			vorne++;
			hinten--;}}}
		if (anzElm==0){ return true;}
		else{ return false;}
```


----------



## SlaterB (1. Jul 2011)

du musst dein Programm nur um einfachste Ausgaben ergänzen, schon siehst du komplett was aktuell passiert:

```
class Palindrom {
    public static void main(String[] args)  {
        String[] Word =      {"l", "a", "g", "e", "r", "r", "e", "g", "a", "l"};
        if (Palindromtester(Word) == true)  {
            System.out.println(" Das Wort Lagerregal ist ein Palindrom");
        }
    }// end main

    public static boolean Palindromtester(String[] w)  {
        int vorne = 0;
        int hinten = w.length;
        int anzElm = w.length + 1;
        System.out.println("length: " + w.length + ", anz: " + anzElm);
        if (w.length % 2 == 1)    {
            while (w[vorne] == w[hinten])      {
                anzElm = anzElm - 2;
                vorne++;
                hinten--;
            }
        }    else   {
            System.out.println("gerade length, aus die Maus");
        }
        if (anzElm == 0)   {
            return true;
        }    else  {
            System.out.println("anzElem != 0, das war dann nix");
            return false;
        }
    }
}
```
Ausgabe:

```
length: 10, anz: 11
gerade length, aus die Maus
anzElem != 0, das war dann nix
```

wenn du schon weißt dass der Grund gerade/ungerade ist, hättest du das ruhig sagen könen,
so hoffe ich mal dass dich diese triviale Info weiterbringt


----------



## Maximaltime (1. Jul 2011)

Habe nun mein hinten und meine anzElm angepasst sowie meine if (w.length%2 ==0) Bedingung





```
public static void main(String[]args){

	String [] Word= {"l","a","g","e","r","r","e","g","a","l"};

	if( Palindromtester (Word)== true){
		System.out.println(" Das Wort Lagerregal ist ein Palindrom");}
}//end main

	public static boolean Palindromtester(String [] w){
		int vorne=0;
		int hinten=w.length-1;
		int anzElm=w.length;

		if (w.length%2 ==0){
		{while(w[vorne]==w[hinten]){
			anzElm=anzElm-2;
			vorne++;
			hinten--;}}}
		if (anzElm==0){ return true;}
		else{ return false;}
```




bekomme nun aber bei der ausgabe:

Exception in threa "main" java.lang.ArrayIndexOutOfBoundsException: 10
        at Palindrom.Palindromtester<Palindrom.java:18>
        at Palindrom.main<Palindrom.java:8>

Weiß damit direkt nix anzufangen.


----------



## SlaterB (1. Jul 2011)

wieso änderst du 
if (w.length % 2 == 1)
auf
if (w.length % 2 == 0)
?
verfolgst du ein Konzept oder machst du das nur weil es zum aktuellen Beispiel besser passt?..

die Fehlermeldung besagt dass irgendein Index zu klein oder hier zu groß ist, String-Länge 10 erlaubt nur Indexe 0-9, es wird mit Index 10 zugegriffen,
da du 'hinten' auf korrekten Anfangswert 9 verbessert hast (hatte ich gar nicht gesehen) ist es zunächst recht mysteriös wieso dort Index 10 kommt,
mit bisschen überlegen kann man aber drauf kommen, 
anderenfalls gibt es immer die Variante ohne wirkliche geistige Arbeit: baue einfach Ausgaben ein, z.B. in die Schleife
"neuer Schleifendurchlauf, Indexe vorne + hinten sind nun: .."
bzw. letztlich vor jedem Array-Zugriff die Indexe vorher ausgeben und Schritt für Schritt zurückverfolgen wie es zu den Indexen kam,
das erfordert wirklich nicht mehr Denken als ein Grundschulkind, rein Fleiß


----------



## Maximaltime (1. Jul 2011)

danke für die schnelle Hilfe auch wenn der ton teilweise leicht herablassend ist


Zitat:
wieso änderst du 
if (w.length % 2 == 1)
auf
if (w.length % 2 == 0)
?


habe ich geändert weil ich mein hinten und anzElm auch um 1reduziert habe

hab nun den Fehler gefunden und ihn abgeändert läuft nun alles 


```
public class Palindrom{


	public static void main(String[]args){

	String [] Word= {"l","a","g","e","r","r","e","g","a","l"};

	if( Palindromtester (Word)== true){
		System.out.println(" Das Wort Lagerregal ist ein Palindrom");}
}//end main

	public static boolean Palindromtester(String [] w){
		int vorne=0;
		int hinten=w.length-1;
		int anzElm=w.length;

		if (w.length%2 ==0){
		while((w[vorne]==w[hinten])&&(anzElm>0)){
			System.out.println("vorne"+ vorne +"hinten" + hinten);
			anzElm=anzElm-2;
			vorne++;
			hinten--;}}
		if (anzElm==0){ return true;}
		else{ return false;}


	}//end Palindromtester

}
```


----------



## SlaterB (1. Jul 2011)

aber noch nicht für ungerade Wörter, falls diese Anmerkung erlaubt ist


----------



## Maximaltime (1. Jul 2011)

Habs nochmal abgeändert jetzt gehen alle Worte ausser einstellig wie z.b. I



```
public class Palindrom{


	public static void main(String[]args){

	String [] Word= {"l","a","g","e","r","e","g","a","l"};

	if( Palindromtester (Word)== true){
		System.out.println(" Das Wort Lagerregal ist ein Palindrom");}
		else{System.out.println(" Das Wort Lagerregal ist kein Palindrom");}
}//end main

	public static boolean Palindromtester(String [] w){
		int vorne=0;
		int hinten=w.length-1;
		int anzElm=w.length;
		if(anzElm%2==1){anzElm++;}

		while((w[vorne]==w[hinten])&&(anzElm>0)){
			//System.out.println("vorne"+ vorne +"hinten" + hinten);
			anzElm=anzElm-2;
			vorne++;
			hinten--;}
		if (anzElm==0){ return true;}
		else{ return false;}


	}//end Palindromtester

}
```


----------



## SlaterB (1. Jul 2011)

eigentlich nicht, bei mit gibt "I" eine Exception (edit: ach so, 'außer', das sollte aber besser auch gehen),
nun will ich auch mal konkret Tipps geben:
du solltest die Prüfung (anzElm>0) VOR dem Array-Zugriff in der While-Bedingung stellen, dann gehts,

Zeile 17 ist unnötig wenn du in Zeile 24 die Bedingung auf <= 0 änderst bzw. Zeile 24+25 könnten komplett in
[c]return anzElem <= 0;[/c] gekürzt werden


----------



## Maximaltime (1. Jul 2011)

Danke nochmals für die Tipps bin ganz neu und werde auch nie soo tief in die materie einsteigen  ich hab nur 2Semester informatik und da lernen wir auch ein wenig java dazu.


----------



## Landei (1. Jul 2011)

Die Mogelversion: [c]boolean isPalindrom = new StringBuilder(s).reverse().toString().equals(s);[/c]


----------



## thorstenthor (1. Jul 2011)

Im Prinzip muss es nur eine Schleife geben, die mit anfang und ende initialisiert wird, und nur läuft, bis linker index >= rechter index, und prüft, ob es buchstaben gibt, die nicht gleich sind, und falls das so ist, sofort abbricht.



Landei hat gesagt.:


> Die Mogelversion: [c]boolean isPalindrom = new StringBuilder(s).reverse().toString().equals(s);[/c]



Immer mit Objekterzeugung verbunden, vermeidet werden sollte nach Effektiver Programmierung.


----------



## SlaterB (1. Jul 2011)

nana, wichtiger als Performance ist ja wohl immer sauberer kurzer, wenig fehler-anfälliger und auch noch schnell geschriebener Code,
in diesem Fall wäre die API unbedingt zu bevorzugen, kommt für eine Hausaufgabe aber natürlich nicht in Frage


----------



## thorstenthor (1. Jul 2011)

SlaterB hat gesagt.:


> nana, wichtiger als Performance ist ja wohl immer sauberer kurzer, wenig fehler-anfälliger und auch noch schnell geschriebener Code,



lol, niemals ein solches programm nehmen, wer nämlich schon in nur einer schleife einen fehler mach, 


```
new StringBuilder(s).reverse().toString().equals(s);
```
 erzeugt sogar zwei instanzen. doppelt unnötig.


----------



## Gast2 (1. Jul 2011)

Es wird sogar zusätzlich zu den 2 StringBuilder instanzen noch einen zusätzliche Stringinstanz erstellt :rtfm:

Aber natürlich ist lesbarer Code immer (vermeindlich) performanterem Code vorzuziehen, es sei denn man muss wirklich das letzte bisschen rausholen. Aber das kommt wohl eher selten vor


----------



## Landei (1. Jul 2011)

Wie kommt ihr auf zwei Instanzen? Der [c]StringBuilder[/c] "reversed" _sich selbst_: 



> Causes this character sequence to be replaced by the reverse of the sequence. ...     Returns: a reference to this object.



StringBuilder (Java Platform SE 6)

Also _erst _gucken, _dann _meckern...

Schöner wäre natürlich, wenn Oracle auch [c]String[/c] eine [c]reverse[/c]-Methode spendieren würde.


----------



## Gast2 (1. Jul 2011)

Tatsache, ich hatte nur den Rückgabewert gesehen und auf das Builder Pattern getippt


----------



## thorstenthor (1. Jul 2011)

Landei hat gesagt.:


> Schöner wäre natürlich, wenn Oracle auch [c]String[/c] eine [c]reverse[/c]-Methode spendieren würde.



ja du hast recht. aber auch, wenn es verlockend klingt, denke ich, dass die entwickler nicht an eine palindrome check method gedacht haben bei dieser, methode.

wenn die einzige aufgabe des programms wäre, dromedare zu testen, dann würde das ins gewicht fallen.ueh:


----------

