Как я могу заменить буквы в строке, например "Привет", с буквами здесь?
String bubbled = "ⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩⒶⒷⒸⒹⒺⒻⒼⒽⒾⒿⓀⓁⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏ";
Сначала я просто делал replaceAll ("a", "ⓐ"), но я чувствую, что должен быть более эффективный способ сделать это.
Вы можете использовать символы a
и ⓐ
для определения значений смещения для алфавита. В сочетании с StringBuilder
он должен быть довольно эффективным. Конечно, вы, вероятно, должны быть очень строгими в том, что входная строка является только символом алфавита.
Это код для того, что я описал выше:
public class Bubbled {
public static void main(String[] args) {
char bubbledA = 'ⓐ';
int lowerCaseOffset = bubbledA - 'a';
int upperCaseOffset = bubbledA - 'A';
String input = "Hello";
StringBuilder bubbledOutput = new StringBuilder();
for (Character c : input.toCharArray()) {
if (Character.isUpperCase(c)) {
bubbledOutput.append((char)(c + upperCaseOffset));
} else {
bubbledOutput.append((char)(c + lowerCaseOffset));
}
}
System.out.println(bubbledOutput.toString());
}
}
Вывод
ⓗⓔⓛⓛⓞ
Сплит bubbled
в строчные и прописные. Создайте новый StringBuilder
, итерации по каждому символу источника, и если chr >= 'a' && chr <= 'z'
append lowercaseBubbled[chr - 'a']
, если он в верхнем регистре делает подобное, просто добавьте chr
. В конце используйте toString
для строителя.
Или вы можете использовать немного менее эффективный метод replaceChars
(поскольку он должен использовать indexOf
), найденный в Apache Commons. Pro: это библиотека, поэтому никакой дополнительной работы для вас.
Вот код snipp, который делает это. Он не создаст объект String String. У меня есть только небольшой набор символов пузыря только для демонстрационной цели. Пожалуйста, настройте по своему усмотрению, и обработка ошибок не была выполнена.
public class StackOverFlow {
private static int[] bubbled = {'ⓐ', 'ⓑ', 'ⓒ', 'ⓓ', 'ⓔ'};
private static int [] plain = {'a', 'b', 'c', 'd', 'e'};
private static Map<Integer, Integer> charMap = new HashMap<>();
public static void main(String[] args) {
String test = "adcbbceead";
for(int i=0; i<plain.length; i++) {
charMap.put(plain[i], bubbled[i]);
}
replaceWithBuffer(test);
}
private static void replaceWithBuffer(String test) {
System.out.println("Oginal String = " + test);
StringBuilder sb = new StringBuilder(test);
for(int i =0; i<test.length(); i++) {
int ch = sb.charAt(i);
char buubledChar = (char)charMap.get(ch).intValue();
sb.setCharAt(i, buubledChar);
}
System.out.println("New String = " + sb.toString());
}
}
Вывод:
Надеюсь это поможет :)
Используйте цикл for:
for (char i='a';i<'z';i++)
str = str.replaceAll(i,bubbled[i-'a']);
for (char i='A';i<'Z';i++)
str = str.replaceAll(i,bubbled[i-'A'+26]);
Конечно, это было бы не слишком эффективно, так как Строки неизменны.
replaceAll()
без повторных полных вызовов ... Или вы можете попробовать выполнить некоторую математическую обработку символов.