Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Chars vergleichen ohne Betrachtung der Groß und Kleinschreibung
Hallo,
für ein Java Programm muss ich Chars vergleichen. Nur soll z.B. a und A gleichermaßen behandelt werden.
Ich will ja nicht für jeden Buchstaben da hier vergleichen:
Java:
if (bsp.charAt(2) == 'a' || bsp.charAt(2) == 'A')
Kann ich da irgendwie machen ohne jetzt Stringmethoden außer .length und.charAt zu verwenden.?
Danke für alle Antworten.
Ein Blick in die ASCII-Tabelle würde da helfen. Klein- und Großbuchstaben liegen jeweils 32 auseinander. So sollte ein generischer Vergleich möglich sein. Großbuchstaben liegen im Bereich zwischen dez. 65 und 90, Kleinbuchstaben zwischen 97 und 122. Somit ist es möglich die 2 Buchstabenklassen zu unterscheiden. Befinden sich beide Buchstaben in unterschiedlichen Klassen, muss einfach zum Großbuchstaben 32 addiert werden, dann können wieder beide Char's mit == verglichen werden.
Ein Blick in die ASCII-Tabelle würde da helfen. Klein- und Großbuchstaben liegen jeweils 32 auseinander. So sollte ein generischer Vergleich möglich sein. Großbuchstaben liegen im Bereich zwischen dez. 65 und 90, Kleinbuchstaben zwischen 97 und 122. Somit ist es möglich die 2 Buchstabenklassen zu unterscheiden. Befinden sich beide Buchstaben in unterschiedlichen Klassen, muss einfach zum Großbuchstaben 32 addiert werden, dann können wieder beide Char's mit == verglichen werden.
Ich hatte gehofft, dass hier noch jemand ergänzt. Leider kam mir vorhin etwas wichtiges dazwischen.
Der Wert/Unterschied 32 ist ziemlich auffällig und entspricht 2^16 also dem 16. Bit im Char. Optimalerweise kann man dieses ja durch bitweises Oder setzen. Mit char | 32 würde man also aus einem Großbuchstaben einen kleinen machen. Damit lässt sich viel Aufwand sparen: boolean result = char1 == char2 || (char1 | 32) == (char2 | 32);
Das sollte klar sein: char1 == char2. Als nächstes folgt ein logisches Oder || , dann folgt der nächste Vergleich der Werte, welche vorher mit bitweisem Oder manipuliert wurden.
Das ganze lässt sich auch Hexadezimal schreiben: System.out.println(char1 == char2 || (char1 | 0x20) == (char2 | 0x20));
... und funktioniert auch mit XOR wie es @mihe7 gezeigt hat: System.out.println(char1 == char2 || (char1 & ~0x20) == (char2 & ~0x20));
Es wird also nicht ein Großbuchstabe in einen Kleinbuchstaben umgewandelt, sondern das 16. Bit wird gelöscht. Es entsteht also ein Großbuchstabe.
--
Scanner input = new Scanner(System.in);
char c;
System.out.println("Beende die Schleife mit q oder Q");
do {
c = input.next().charAt(0);
} while (letterToLowerCase(c) != 'q');
System.out.println("Ende");
}
private static char letterToLowerCase(char c) {
if (c < 65 || c > 90)
return c;
return (char) (c | 32);
}
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while (true) {
String l = input.nextLine();
if (l.isBlank()) {
break;
}
char c = l.charAt(0);
if (c >= 'A' && c <= 'Z') {
System.out.println("Das war ein großes: " + (char) (c + ('a' - 'A')));
} else if (c >= 'a' && c <= 'z') {
System.out.println("Das war ein kleines: " + (char) (c - ('a' - 'A')));
} else {
System.out.println("Das war gar kein Buchstabe! " + c);
}
}
}
}