Chars vor array übergabe toLowerUpcase

Proxy

Mitglied
Schönen Guten Tag,

ich habe folgendes Problem.Ich möchte gerne das, wenn ich ein Palimdrom eingebe und der erste Buchstabe groß ist, er trotzdem erkennt das es ein Palindrom ist.
Deswegen wollte ich das er erst alle Buchstaben in Kleinbuchstaben umwandelt. Mein Problem ist die Zeile 7 oder 8. Schonmal vielen Dank für die Tipps. :)
Java:
public class Palindrom {

    public static void main(String[] args) {
        
        
        System.out.println("Bitte Wort eingeben: ");
        String word = readWord();
        word.toLowerCase();
        char []array = word.toCharArray();
        System.out.println(palindrom(array));
        
    }
    
    public static boolean palindrom ( char[]array) {
        
        int left =0;
        int rigth = array.length-1;
        
        while(left<rigth) {
            if ( array[left]!=array[rigth]) {
                return false;
            }
            left++;
            rigth--;
            
        }
        return true;
    }
}
 

Oneixee5

Top Contributor

Marsupilami

Mitglied
Es ging mir nur darum Ihm aufzuzeigen, dass es noch andere Möglichkeiten gibt, die Groß- bzw. Kleinschreibung außer Acht zu lassen. Er muss um auf ein mögliches Palindrom zu prüfen ja auch nicht zwingend zuerst in ein char-array konvertieren, sondern kann ja auch anders prüfen.
 

Blender3D

Top Contributor
Schönen Guten Tag,

ich habe folgendes Problem.Ich möchte gerne das, wenn ich ein Palimdrom eingebe und der erste Buchstabe groß ist, er trotzdem erkennt das es ein Palindrom ist.
Deswegen wollte ich das er erst alle Buchstaben in Kleinbuchstaben umwandelt. Mein Problem ist die Zeile 7 oder 8. Schonmal vielen Dank für die Tipps. :)
Wie @httpdigest bereits erwähnt hat fehlt die Zuweisung.
Mein Tipp geht in eine andere Richtung.
1) Das Umwandeln des Strings in ein char Array ist ein unnötiger Umweg.
Grund: Du liest das Wort in einen String ein und musst diesen in ein char Array umwandeln.
2) Die Namensgebung
Die Funktion gibt einen boolean zurück. In dem Fall ist es üblich, dem Funktionsnamen ein (is)Name voranzustellen.
Also statt palindrom() lieber isPalindrom().
3) Unnötiger Gebrauch von 2 Variablen
Das Ganze lässt sich mit einer laufenden Variable realisieren.
Java:
public static boolean isPalindrom(String txt) {
        txt = txt.toLowerCase();
        for (int i = 0; i < txt.length() / 2; i++) {
            if (txt.charAt(i) != txt.charAt(txt.length() - 1 - i))
                return false;
        }
        return true;
    }
 

Marsupilami

Mitglied
Geht auch mit einem Einzeiler😀
public class Palindrom {


Java:
public class Palindrom {

    public static void main(String[] args)
    {
        System.out.println(Palindromtest());
    }

    public static boolean Palindromtest()
    {
        String s = "Otto";
        StringBuilder sb = new StringBuilder(s);
        
        return sb.reverse().toString().equalsIgnoreCase(s);
    }
    
}
 

Blender3D

Top Contributor
Geht auch mit einem Einzeiler😀
Du meinst so?
Java:
public static boolean isPalindrom(String s) {       
        return (new StringBuilder(s)).reverse().toString().equalsIgnoreCase(s);
    }
Ja funktioniert.
Aber zu welchem Preis? (Umweg )
1) Es wird ein Stringbuilder Objekt aus dem String erzeugt
2) Das Stringbuilder Objekt wird umgedreht.
3) Aus dem Stringbuilder Objekt wird ein neuer String erzeugt.
4) Der ursprüngliche String wird in seiner vollen Länge mit dem neuem String verglichen.

In der anderen Variante wird ausschließlich der übergebene String in der halben Länge durchlaufen.
Ein Algorithmus der die Aufgabe hat 1 Million oder mehr Worte auf die Eigenschaft Palindrom zu testen würde sich wahrscheinlich nicht über nur 1 Zeile Code freuen.
 

KonradN

Super-Moderator
Mitarbeiter
Also da meine Sichtweise doch deutlich abweicht, möchte ich diese einmal hier etwas darstellen. Ich sehe vor allem Clean Code Aspekt und da komme ich halt zu einer deutlich anderen Bewertung als @Blender3D:

Aber zu welchem Preis? (Umweg )
Also genau das sehe ich anders. Das ist eine Form der Optimierung und da gilt aus meiner Sicht: Don't do it:
Roter Grad | Clean Code Developer (clean-code-developer.de)

Der Ansatz aus meiner Sicht sollte doch sein:
a) Fachliches Verständnis. Und da schaut man einfach, was ein Palindrom ist:
Als Palindrom (altgriechisch παλίνδρομος palíndromos „rückwärts laufend“) werden in der Sprachwissenschaft Wörter, Wortreihen oder Sätze bezeichnet, die rückwärts gelesen genau denselben Text oder zumindest einen Sinn ergeben.
Palindrom – Wikipedia

b) Und das setze ich dann 1:1 um:
Java:
public boolean isPalindrom(@NonNull String text) {
    text.equalsIgnoreCase(reversed(text));
}

Dann kommt natürlich noch das reversed, das man benötigt. Dazu kann man dann z.B. zu dem StringBuilder greifen. Das wäre vermutlich auch mein Ansatz.

Das erfüllt die Anforderung sehr einfach und gradlinig. Klar: Mit etwas nachdenken weiss man: Ich muss nur die erste Hälfte prüfen, aber das verkompliziert den Code. KISS - Keep it simple, stupid. (Auch im roten Grad von Clean Code Developers, erster gegebener Link.)


Also um es ganz klar und deutlich zu sagen: So Optimierungen sind der größte Feind von Clean Code! Toll, dass Du irgend einen optimierten Algorithmus hast, aber der Code zeigt nicht auf einen Blick, was er macht.

Und ganz nebenbei: Es kann durchaus schneller sein, einen ganzen String zu vergleichen als viele Einzelvergleiche zu haben. Die CPUs haben zum Vergleich von Speicherbereichen Befehle (z.B. CMPS bei i386 CPUs.) Somit denke ich, dass eine Aussage zur Performance hier schlicht keine Grundlage hat. Die Optimierungen kennen wir z.B. nicht und müssten da also deutlich mehr betrachten. (Daher: Keine Optimierungen ohne genaue Analyze! Und eine Analyze umfasst im das ganze Problem. 1. Ist es wirkliche diese Stelle, die das Problem ist? 2. Was für Lösungsmöglichkeiten gibt es? Evtl. ändert man die Datenhaltung oder macht gewisse Dinge generell an anderer Stelle oder so.)

Ich würde also definitiv die Lösung mit dem StringBuilder bevorzugen. (Wobei die ganze Fragestellung an dem Kernthema vorbei geht - das dürfte eine Übung für Anfänger gewesen sein, wo es darum ging, paar Grundlagen zu erlernen. Da ist der Ansatz mit der Schleife natürlich die gewünschte Lösung. Aber der Punkt wurde bei der Diskussion ja außen vor gelassen.)
 

Blender3D

Top Contributor
Also genau das sehe ich anders. Das ist eine Form der Optimierung und da gilt aus meiner Sicht: Don't do it:
Ich bin so wie Du für gut lesbaren Code. Aber auch hier gilt es den Kontext zu betrachten.
Bei Util funktionen die eventuell sehr oft in Folge benutzt werden ist die Geschwindigkeit viel wichtiger als die Lesbarkeit. So werden z.B. Math.sqrt .. sogar meist nativ umgesetzt.
Die Lesbarkeit ist trotzdem gegeben, da sich die Benutzung auf die Schnittstelle beschränkt.
wert = Math.sqrt( 3 ).
isPalindrom( "otto" )

Würde der Benutzer mit dieser Funktion die Anzahl der Palindrome in vielen Büchern zählen wollen, wäre er mit der schnelleren Variante sicher besser beraten.

Und ganz nebenbei: Es kann durchaus schneller sein, einen ganzen String zu vergleichen als viele Einzelvergleiche zu haben. Die CPUs haben zum Vergleich von Speicherbereichen Befehle (z.B. CMPS bei i386 CPUs.) Somit denke ich, dass eine Aussage zur Performance hier schlicht keine Grundlage hat.
Es handelt sich hier nicht nur um den Vergleich der halbiert ist.
Wichtiger ist:
Es werden pro Vergleich 2 neue Objekte erzeugt.
a) StringBuilder mit zusätzlichem Aufruf von reverse
b) String
c) Vergleich über die gesamte Länge
Wenn wir das Ganze millionenfach aufrufen .....
Funktionen wie Palindrom gehören zu sogenannten Utilfunktionen. Diese werden normalerweise importiert und benutzt. Wichtig für die Lesbarkeit ist die Schnittstelle.
Der Benutzer der Funktion kennt die Implementierung nicht, und braucht sie auch nicht zu kennen. Er benutzt sie lediglich über die Schnittstelle die in beiden Fällen gleich lautet
isPalindrfom( text ) .
 

mrBrown

Super-Moderator
Mitarbeiter
Der ursprüngliche String wird in seiner vollen Länge mit dem neuem String verglichen.
Vergleich über die gesamte Länge
Wie kommst du darauf? Verglichen wird bis zum ersten unpassenden Zeichen.

Es werden pro Vergleich 2 neue Objekte erzeugt.
a) StringBuilder mit zusätzlichem Aufruf von reverse
b) String
Wird der Compiler weg-optimieren, das teure ist das Umdrehen des Arrays
 

Neumi5694

Top Contributor
Du meinst so?
Java:
public static boolean isPalindrom(String s) {     
        return (new StringBuilder(s)).reverse().toString().equalsIgnoreCase(s);
    }
Ja funktioniert.
Aber zu welchem Preis? (Umweg )
1) Es wird ein Stringbuilder Objekt aus dem String erzeugt
2) Das Stringbuilder Objekt wird umgedreht.
3) Aus dem Stringbuilder Objekt wird ein neuer String erzeugt.
4) Der ursprüngliche String wird in seiner vollen Länge mit dem neuem String verglichen.

In der anderen Variante wird ausschließlich der übergebene String in der halben Länge durchlaufen.
Ein Algorithmus der die Aufgabe hat 1 Million oder mehr Worte auf die Eigenschaft Palindrom zu testen würde sich wahrscheinlich nicht über nur 1 Zeile Code freuen.
Kommt jetzt drauf an, was der Compiler daraus macht. Wenn jeder Teilbefehl einzeln in die CPU geschickt wird, dann ist das klar langsamer.
Da es aber Pipelines mit 20 oder mehr Befehlen gibt, könnte es sich die Waage halten. Inwiefern die JVM das nutzen kann, steht freilich auf einem anderen Blatt.
Wer Lust hat, kann das gerne mal testen :)

Aber selbst falls seine Methode langsamer ist ... macht man das denn wirklich eine Million mal in Folge? Ob der Check in einem Userformular nun eine oder zwei Millisekunden braucht, ist nämlich vollkommen irrelevant.
Fast alles, was heutzutage zu gutem Programmierstil gehört, ist deutlich langsamer, als wenn man es direkt hardcodiert, so wie auch das Aufrufen von Methoden per se. Die JVM muss da im Hintergrund einiges machen. Die Befehle direkt als Spaghetticode zu schreiben, wäre effizienter. Mittlerweile ist Lesbarkeit und Wiederverwertbarkeit wichtiger als Kosteneffizienz. Anwendungen werden weniger durch CPU-Leistung als durch Verzögerungen beim Netzwerkzugriff ausgebremst. So lange man keine Treiber schreibt oder aufwendige mathematische Berechnungen macht, sollte man den Fokus nicht auf i-Tüpftelchen legen.
Und ja, auch ich hab meine Schwierigkeiten damit. Ich hasse Streams in Java nach wie vor, weil sie so arschlangsam sind. Wo es keinen deutlichen Vorteil bringt, einen Stream zu verwenden, bleibe ich bei Iterables. Einen Lesbarkeits-Kompromiss stellt forEach bei Collections dar, intern wird da mit einer Iterable gearbeitet (bei mir geht's aber auch wirklich fast immer um mathematische Berechnungen, bei den Formularen bin ich da toleranter).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Byte-Array kann chars speichern? Java Basics - Anfänger-Themen 3
J Alle Vorkommen eines chars in einem Array durch einen anderen char ersetzen Java Basics - Anfänger-Themen 10
C Frage zu: String einlesen -> Array von Chars erhalten Java Basics - Anfänger-Themen 4
S Chars vergleichen ohne Betrachtung der Groß und Kleinschreibung Java Basics - Anfänger-Themen 7
JaVaN0oB Wörterraten - Falsche Ausgabe, String/Chars vergleichen Java Basics - Anfänger-Themen 2
J erstes Vorkommen eines Chars aus einem String entfernen Java Basics - Anfänger-Themen 3
J erstes Vorkommen eines chars entfernen Java Basics - Anfänger-Themen 1
J String Methode chars() Java Basics - Anfänger-Themen 8
C Chars in einem String alphabetisch sortieren Java Basics - Anfänger-Themen 1
C Chars eines Strings mit for schleife rückwärts auslesen Java Basics - Anfänger-Themen 8
J Haben Chars wirklich keine KeyCodes? Java Basics - Anfänger-Themen 12
P Wie reagiere ich auf Strings mit zu vielen Chars ? Java Basics - Anfänger-Themen 6
B chars auf Zahlen überprüfen Java Basics - Anfänger-Themen 4
G Datentypen bits, bytes, chars - Verständnisfrage Java Basics - Anfänger-Themen 5
Developer_X Die Kunst der Alten Runen in Chars, leider nicht in String konvertierbar? Java Basics - Anfänger-Themen 28
G wie chars mit einer menge von chars vergleichen Java Basics - Anfänger-Themen 9
X txt. mit Strings und Chars einlesen? Java Basics - Anfänger-Themen 3
H Zahlnwert eines chars Java Basics - Anfänger-Themen 5
J int-kette in chars umwandeln Java Basics - Anfänger-Themen 10
Bierhumpen chars vergleichen Java Basics - Anfänger-Themen 8
R Eingabe eines Chars mit Überprüfung Java Basics - Anfänger-Themen 3
A Zeichenkette teilen mit Substring oder Char Array Java Basics - Anfänger-Themen 14
A 6. Element aus einem Array zurückgeben Java Basics - Anfänger-Themen 1
A Was bedeutet bei einem Array "int a [MAX][MAX];", Java Basics - Anfänger-Themen 7
T Array verkleinern Java Basics - Anfänger-Themen 2
J Array aus Numberfield Eingaben Java Basics - Anfänger-Themen 7
D Array List mit Objekten sortieren Java Basics - Anfänger-Themen 2
onlyxlia Anzahl Random Zahlen mit Scanner abfragen und in Array speichern Java Basics - Anfänger-Themen 10
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
Ü Zweidimensionales Array in der ersten Zeile deklarieren Java Basics - Anfänger-Themen 13
Thomas Uppe 2D Array Reihenfolge vermischen Java Basics - Anfänger-Themen 4
T array auslesen Java Basics - Anfänger-Themen 2
Nitrogames Variablen Variable aus JOptionPane Abfrage in Array einfügen Java Basics - Anfänger-Themen 4
moini Auf Array aus Superklasse zugreifen? Java Basics - Anfänger-Themen 2
J ArrayList in 2D-Array konvertieren. Java Basics - Anfänger-Themen 48
M NullPointerException: Cannot read the array length because "this.Kinder" is null Java Basics - Anfänger-Themen 1
P Wieso kann ich als Index für einen Array einen Char angeben? Java Basics - Anfänger-Themen 3
Finn_lol Fehlermeldung bei Schleife mit Array Java Basics - Anfänger-Themen 4
iAmFaiinez Primzahlen Tester ohne Array Java Basics - Anfänger-Themen 4
S array 2 dimensional treppe Java Basics - Anfänger-Themen 3
S Array 2x2 Blöcke mit 0 und 1 Java Basics - Anfänger-Themen 10
C Array von Klassen Java Basics - Anfänger-Themen 2
julian0507 2Dim-Array Spaltensummen Java Basics - Anfänger-Themen 1
XWing Doppelte Zahlen im Array Java Basics - Anfänger-Themen 8
melisax Java 2D-Array Tabelle Java Basics - Anfänger-Themen 4
melisax Java Array Wert an bestimmtem Index angeben Java Basics - Anfänger-Themen 14
W Items löschen aus String Array vom Custom Base Adapter Java Basics - Anfänger-Themen 2
Proxy Stack erweitern mit neuem Array falls der alte voll ist!? Java Basics - Anfänger-Themen 5
E Array, nächste Zahl zur 5 ausgeben, wie? Java Basics - Anfänger-Themen 42
J Array.list vergleichen Java Basics - Anfänger-Themen 1
W Java-Code mit Array Java Basics - Anfänger-Themen 14
D Reflections & Generisches Array Java Basics - Anfänger-Themen 4
T Array Java Basics - Anfänger-Themen 2
T Array Java Basics - Anfänger-Themen 15
T Wörteranzahl im Array zählen Java Basics - Anfänger-Themen 9
Ostkreuz Zweidimensionaler Array Index Java Basics - Anfänger-Themen 2
S String Array Buchstaben um einen gewissen Wert verschieben Java Basics - Anfänger-Themen 4
R Images aus einem Array ausgeben Java Basics - Anfänger-Themen 3
R 2d Array individuell machen Java Basics - Anfänger-Themen 4
D 2D Char Array into String Java Basics - Anfänger-Themen 2
J Array Median bestimmen Java Basics - Anfänger-Themen 6
S Array Maximum bestimmen mit for und foreach Java Basics - Anfänger-Themen 7
S Prüfen ob ein zweidimensionales Array rechteckig ist Java Basics - Anfänger-Themen 4
N Array Java Basics - Anfänger-Themen 1
J Array Mittleren Wert bestimmen Java Basics - Anfänger-Themen 2
D OOP Array einem Objekt zuweisen Java Basics - Anfänger-Themen 2
O Zahlen aus einem char-array per char + Zeichen addieren Java Basics - Anfänger-Themen 2
S leeres Array statt Null Pointer Exception ausgeben Java Basics - Anfänger-Themen 20
S Inhalte aus Array vergleichen und Max ausgeben Java Basics - Anfänger-Themen 3
M 2d array ohne längen anlegen Java Basics - Anfänger-Themen 4
S Bestimmte werte aus einem Array löschen Java Basics - Anfänger-Themen 2
S Ausgeben wie oft ein Wert in einem Array vorkommt Java Basics - Anfänger-Themen 7
E Reihenfolge der Werte umdrehen (mittels statischem int-Array Java Basics - Anfänger-Themen 3
O 2 Dimensionales Array Java Basics - Anfänger-Themen 6
M Bubble Sort - Int[] Array sortieren Java Basics - Anfänger-Themen 2
javaBoon86 Array mehrere Dimensionen Java Basics - Anfänger-Themen 10
B Array nach Elementwerten sortieren? Java Basics - Anfänger-Themen 1
B Explizit Array definieren geht nicht? Java Basics - Anfänger-Themen 14
D Kleinste Zahl in Array finden die vorher noch errechnet werden müssen. Java Basics - Anfänger-Themen 4
L Gegebenes Array sortieren, indem zufällige Zahlenpaare aus Array ausgewählt werden Java Basics - Anfänger-Themen 14
Say 2-DIM Array Code lesen und verstehen Java Basics - Anfänger-Themen 5
N Array beim erstellen mit Werten füllen Java Basics - Anfänger-Themen 6
C Java Array Struktur, welche ist wann besser? Java Basics - Anfänger-Themen 12
Temsky34 Array IndexOf nicht verfügbar Java Basics - Anfänger-Themen 18
belana wie am besten 2D Array von String to Integer Java Basics - Anfänger-Themen 18
S Array mit Methode löschen Java Basics - Anfänger-Themen 2
J Java To String Methode, Array mit For-Schleife Java Basics - Anfänger-Themen 2
E Durch Muster in Array iterieren Java Basics - Anfänger-Themen 3
L Frage zum Array Java Basics - Anfänger-Themen 1
C 2D Array Ausgabe mit for-Schleife i,j Java Basics - Anfänger-Themen 4
D Methode: Array Reihenfolge tauschen Java Basics - Anfänger-Themen 3
julian0507 Array aus Methode in anderer Methode sichtbar machen Java Basics - Anfänger-Themen 10
P Array vom Typ Klasse Java Basics - Anfänger-Themen 18
Lion.King Array deklarieren und initialisieren Java Basics - Anfänger-Themen 5
P Array-Objekte-Aufruf Java Basics - Anfänger-Themen 22
A CSv.Datei einlesen und die werte in zweidemosional Int Array speichern Java Basics - Anfänger-Themen 9
M Methoden Zweidimensionaler Array mit Setter Methode ändern Java Basics - Anfänger-Themen 4
AkiJou Zeile in 2d Array löschen Java Basics - Anfänger-Themen 2
LilliCherry Array in einer Zeile ausgeben Java Basics - Anfänger-Themen 6
A Elemente in einem Array Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben