Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java括号在字符串中翻转_Java_String - Fatal编程技术网

Java括号在字符串中翻转

Java括号在字符串中翻转,java,string,Java,String,我如何在字符串上进行替换,使“(“变成”)和“)”变成“(”?使用.replace()很有诱惑力,但是如果用替换)(然后用)替换()你将得到所有)。相反,迭代字符串并使用stringbuilder构建字符串 String swapParens(String s) { StringBuilder sb = new StringBuilder(); sb.ensureCapacity(s.length()); // preallocate to prevent resizing

我如何在字符串上进行替换,使“(“变成”)和“)”变成“(”?

使用
.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();

}
String swapparen(字符串s){
StringBuilder sb=新的StringBuilder();
sb.ensureCapacity(s.length());//预先分配以防止调整大小
对于(int i=0;i
我知道你可以在那里放一些东西作为占位符来交换,但是如果它已经存在于你的字符串中,你会有一个大问题

考虑使用“xxx”作为交换字符串。如果您的字符串是“abcx(yz)”,您将(用xxx替换,最后用“abcxxyz)”替换为(因此您有“abcxxxyz”(.然后您将xxx替换为),那么您有“abc)xyz”(.当然不酷!

如何

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

其中,
xxx
肯定不会出现在您的字符串中。

您可以先将
(“
替换为未使用的字符,然后将
替换为
”(“
,然后将未使用的字符替换为
”)

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();

}
但是,如果字符串中已经有一个空字符,这将不起作用,因此这不是一个好的通用解决方案

否则,您可以使用的方法,但更有效的方法是将字节放入数组并自己替换,然后重新构建字符串:

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);
}
String swapparen(字符串s){
char[]bytes=s.toCharArray():
对于(int i=0;i
如果在文本字符串中有一个你永远找不到的字符,你可以使用
.replace(')、'unusedChar').replace('('、')).replace('unusedChar'、'(');
对于(int i=0;i你如何保证某个特定的子串永远不会出现?好吧,你几乎可以保证某个特定的长子串出现在特定类型的文本中的预期时间是在宇宙消亡之后的某个时候。这当然是最正确的方法。实际上,它也可能是最有效的方法字符串只被复制了一次。我喜欢您的示例,它显示即使原始字符串中不包含
xxx
,也可能会导致问题。我只建议为StringBulder ctor添加容量,以避免重新分配:StringBuilder(s.length())(更新:was added)@road根据时间戳判断,它是在您的注释之前添加的,偶数:-)我承认,你对效率的评价启发了我,当你考虑String Bu建器重新分配时,字符串确实不止一次被复制了。我不主张所有权:特别是因为你更喜欢EnSuthReAPACTY()到构造函数()。
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();