Die beiden anderen Antworten erzeugen den richtigen Ausgang, aber sie sind nicht sehr effizient, so dass hier mein nehmen ist.
Ihre consonants
sollte eine Konstante sein, und sollte einfach als Kleinbuchstaben angegeben werden. Als Konstante sollte sie in Großbuchstaben angegeben werden (CONSONANTS
).
ein Zeichen für Zeichen Ersatz zu tun, der effizienteste Weg ist, um die char[]
des ursprünglichen Zeichenfolge erhalten toCharArray()
verwenden, ändern die das Array und erstellen new String(char[])
eine neue Zeichenfolge verwendet wird.
Der einfachste Weg, den Index eines Buchstabens in der CONSONANTS
Konstante zu finden, ist die indexOf()
Methode zu verwenden.
Um einen Überlauf beim Hinzufügen von 1 zum Index zu vermeiden, verwenden Sie den Modulo-Operator (%
).
private static final String CONSONANTS = "bcdfghjklmnpqrstvwxyz";
private static String shiftConsonants(String input) {
char[] chars = input.toLowerCase().toCharArray();
for (int i = 0; i < chars.length; i++) {
int idx = CONSONANTS.indexOf(chars[i]);
if (idx != -1)
chars[i] = CONSONANTS.charAt((idx + 1) % CONSONANTS.length());
}
return new String(chars);
}
Test:
System.out.println(shiftConsonants("Java")); // prints: kawa
Hier ist eine alternative Lösung, die den ursprünglichen Fall behält.
private static final String CONSONANTS = "bcdfghjklmnpqrstvwxyz";
private static String shiftConsonants(String input) {
char[] chars = input.toCharArray();
for (int i = 0; i < chars.length; i++) {
char ch = chars[i];
char lower = Character.toLowerCase(ch);
int idx = CONSONANTS.indexOf(lower);
if (idx != -1) {
char next = CONSONANTS.charAt((idx + 1) % CONSONANTS.length());
chars[i] = (ch == lower ? next : Character.toUpperCase(next));
}
}
return new String(chars);
}
Test:
System.out.println(shiftConsonants("Java")); // prints: Kawa
Follow-up zu comment by @MistahFiggins:
Casting Würde für jedes Zeichen in int und dann die Nummer ändern und Gießen wieder mehr oder weniger effizient?
Meine Vermutung war falsch. Für die Kleinbuchstabenversion (die erste oben) ist das numerische Inkrement 36% schneller.
private static String shiftConsonants(String input) {
char[] chars = input.toLowerCase().toCharArray();
for (int i = 0; i < chars.length; i++) {
char ch = chars[i];
if (ch == 'z')
chars[i] = 'b';
else if (ch >= 'b' && ch <= 'y' && ch != 'e' && ch != 'i' && ch != 'o' && ch != 'u') {
ch = (char)(ch + 1);
if (ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u')
ch++;
chars[i] = ch;
}
}
return new String(chars);
}
Wie Sie sehen können, ist es optimiert, um nicht einmal a
zu betrachten.
FYI: "* * Alphabet" ist die gesamte Sequenz von * * Buchstaben in der entsprechenden Sprache/Land, z.B. A-Z für englische Sprachen. Der Titel "Konsonanten durch nächstes Alphabet ersetzen" sollte also "Konsonanten mit nächstem Buchstaben ersetzen" ersetzen, oder genauer gesagt "Konsonanten durch folgenden Konsonanten im Alphabet ersetzen", denn das ist es, was Sie wirklich wollen. – Andreas