Заменить содержимое одной строки на другую?

1

Как я могу заменить буквы в строке, например "Привет", с буквами здесь?

String bubbled = "ⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩⒶⒷⒸⒹⒺⒻⒼⒽⒾⒿⓀⓁⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏ";

Сначала я просто делал replaceAll ("a", "ⓐ"), но я чувствую, что должен быть более эффективный способ сделать это.

  • 0
    Вы можете использовать массивы, но это просто еще один способ выполнить кучу replaceAll() без повторных полных вызовов ... Или вы можете попробовать выполнить некоторую математическую обработку символов.
Теги:
string
unicode

4 ответа

2
Лучший ответ

Вы можете использовать символы 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());
    }
}

Вывод

ⓗⓔⓛⓛⓞ

  • 0
    Я думаю об использовании смещений. Спасибо чувак!
  • 0
    @ sn0wman Рад, что смог помочь.
3

Сплит bubbled в строчные и прописные. Создайте новый StringBuilder, итерации по каждому символу источника, и если chr >= 'a' && chr <= 'z' append lowercaseBubbled[chr - 'a'], если он в верхнем регистре делает подобное, просто добавьте chr. В конце используйте toString для строителя.

Или вы можете использовать немного менее эффективный метод replaceChars (поскольку он должен использовать indexOf), найденный в Apache Commons. Pro: это библиотека, поэтому никакой дополнительной работы для вас.

2

Вот код 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());
    }
}

Вывод:

Изображение 174551

Надеюсь это поможет :)

  • 0
    Это очень помогло, спасибо!
1

Используйте цикл 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]);

Конечно, это было бы не слишком эффективно, так как Строки неизменны.

  • 0
    @ Амадан Исправил это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню