Скобки в скобках Java в строке - PullRequest
3 голосов
/ 18 апреля 2011

Как я могу заменить строку, чтобы "(" становится ")" и ")" стало "("?

Ответы [ 5 ]

8 голосов
/ 18 апреля 2011

Было бы заманчиво использовать .replace(), но если вы замените ) на (, а затем ( на ), вы получите все ). Вместо этого переберите строку и используйте stringbuilder для построения вашей строки.

String swapParens(String s) {
    StringBuilder sb = new StringBuilder();
    sb.ensureCapacity(s.length()); // preallocate to prevent resizing
    for(int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        switch(c) {
            case ')': sb.append('('); break;
            case '(': sb.append(')'); break;
            default: sb.append(c);
        }
    }
    return sb.toString();

}

Я знаю, что вы могли бы поместить что-то в качестве заполнителя для замены, но если бы оно уже существовало в вашей строке, у вас была бы большая проблема.

Попробуйте использовать "xxx" в качестве строки подкачки. Если ваша строка была «abcx (yz)», и вы заменили (на xxx, вы в конечном итоге на «abcxxxyz)», затем вы заменили) на (так что у вас есть «abcxxxxyz (». Затем вы заменяете xxx на), чтобы вы имели » abc) xyz (". Конечно, не круто!

3 голосов
/ 18 апреля 2011

Как насчет

text.replace("(", "xxx").replace(")", "(").replace("xxx",")")

где xxx - это то, что, конечно, не встречается в вашей строке.

1 голос
/ 18 апреля 2011
StringBuffer str = new StringBuffer(text);
for(int i=0; i<str.length(); i++){
   if(str.charAt(i)=='(') srt.setCharAt(i,')');
   else if(str.charAt(i)==')') str.setCharAt(i,'(');
}
text = str.toString();
1 голос
/ 18 апреля 2011

Сначала вы можете заменить "(" неиспользованным символом, затем ")" на "(", затем этот неиспользованный символ на ")":

String swapParens(String s) {
    return s.replace('(', '\0').replace(')', '(').replace('\0', ')');
}

Если у вас уже есть нулевой символ вСтрока, однако, не будет работать, поэтому это не очень хорошее общее решение.

В противном случае вы можете использовать подход glowcoder , но что может быть более эффективным, так это получение байтовв массив и замените их самостоятельно, затем пересоберите строку:

String swapParens(String s) {
    char[] bytes = s.toCharArray():
    for (int i=0; i < bytes.length; ++i) {
        if (bytes[i]=='(') bytes[i] = ')';
        else if (bytes[i]==')') bytes[i] = '(';
    }
    return new String(bytes);
}
0 голосов
/ 18 апреля 2011

Если есть символ, который вы никогда не найдете в текстовой строке, вы можете использовать .replace(')', 'unusedChar').replace('(', ')').replace('unusedChar', '(');

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...