Palindromtester Methode

M

Maximaltime

Gast
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

Java:
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;}
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
du musst dein Programm nur um einfachste Ausgaben ergänzen, schon siehst du komplett was aktuell passiert:
Java:
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:
Code:
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
 
M

Maximaltime

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




Java:
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.
 
S

SlaterB

Gast
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ß
 
M

Maximaltime

Gast
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

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

}
 
M

Maximaltime

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


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

}
 
S

SlaterB

Gast
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
 
M

Maximaltime

Gast
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.
 

thorstenthor

Bekanntes Mitglied
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.

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

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

SlaterB

Gast
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

Bekanntes Mitglied
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, :eek:

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

Gast2

Gast
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

Top Contributor
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.
 
Zuletzt bearbeitet:

thorstenthor

Bekanntes Mitglied
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.:pueh:
 

Neue Themen


Oben