Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.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_Replace - Fatal编程技术网

Java 将字符串中的运算符更改为相反运算符的最佳方法

Java 将字符串中的运算符更改为相反运算符的最佳方法,java,replace,Java,Replace,我有一个字符串,比如:value+=5*3-(2/4) 现在我必须将所有运算符更改为相反的运算符,因此: +至- -至+ *至/ /到* 我的问题是当我使用replaceAll()函数时 第一次: string.replaceAll(“+”,“-”)我变成:值-=5*3-(2/4) 第二次: string.replaceAll(“-”、“+”)我变成:值+=5*3+(2/4) 但它必须是:value-=5*3+(2/4) 如何实现这一点?您可以先将符号(+、-、…)替换为表达式中无法出现的不同符

我有一个字符串,比如:
value+=5*3-(2/4)

现在我必须将所有运算符更改为相反的运算符,因此:
+至-
-至+
*至/
/到*

我的问题是当我使用
replaceAll()
函数时

第一次:
string.replaceAll(“+”,“-”)我变成:
值-=5*3-(2/4)

第二次:
string.replaceAll(“-”、“+”)我变成:
值+=5*3+(2/4)

但它必须是:
value-=5*3+(2/4)


如何实现这一点?

您可以先将符号(+、-、…)替换为表达式中无法出现的不同符号,例如+->A、->B、。。。比所有关于-,Bs到+,的。
另一个选项是从字符串创建字符数组,然后迭代该数组并在原地反转符号。然后再次创建字符串。

我认为一个简单的循环可以工作

String exp="YOUR EXPRESSION HERE";
String newStr=""; 
//loop through the string
for(int i=0;i<exp.length();i++)
{
    char ch=exp.charAt(i);//extract a charcter
    switch(ch)
    {
        case '+':
            newExp+='-';// replace + with -
            break;

        case '-':
            newStr+='+';// and - with +
            break;

        case '*';
            newStr+='/'// divide with *
            break;

        case '/'
            newStr+='*';// multiply with /
            break;

        default:
        newStr+=ch;// leave it as it is


    }

}
String exp=“此处的表达式”;
字符串newStr=“”;
//在字符串中循环

对于(inti=0;i而言,您最好只是在
char
数组中循环遍历这些值

String val = "value += 5 * 3 - (2 / 4)";
char[] cArray = val.toCharArray();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < cArray.length; i++) {
    if (cArray[i] == '+') {
        sb.append("-");
    } else if (cArray[i] == '-') {
        sb.append("+");
    // repeat for others
    } else {
        sb.append(cArray[i]);
    }
}
String val=“value+=5*3-(2/4)”;
char[]cArray=val.toCharArray();
StringBuilder sb=新的StringBuilder();
对于(int i=0;i
输出:

值-=5*3+(2/4)


为什么不一个字符一个字符地循环字符串,一次替换一个字母来避免这种混乱呢

public String revert(String expression){
        char[] temp = expression.toCharArray();
        for(int i = 0; temp.length> i; i++){
            switch(temp[i]){
                case '/':
                    temp[i] = '*';
                break;
                case '*':
                    temp[i] = '/';
                break;
                case '-':
                    temp[i] = '+';
                break;
                case '+':
                    temp[i] = '-';
                break;
            }
        }
        return new String(temp);
    }

您可以使用要替换的字符创建一个映射,并按如下方式遍历字符串:

public static void main(String[] args) {
  Map<Character, Character> replacers = new HashMap<>();
  replacers.put('+', '-');
  replacers.put('-', '+');

  String value = "value += 5 * 3 - (2 / 4)";
  StringBuilder out = new StringBuilder();
  for (char c : value.toCharArray()) {
    out.append(replacers.getOrDefault(c, c));
  }
  System.out.println(out.toString());
}

replaceAll
并不意味着“替换所有出现的情况”,而是“替换与给定正则表达式匹配的所有情况”。(这可能不是主要问题,但也可能是一个问题,因为许多字符在正则表达式中具有特殊含义)为什么不一个字符一个字符地循环字符串并一次替换一个字母来避免这种混乱呢?我知道
replaceAll
是如何工作的。这就是为什么我知道它不能与
replaceAll
一起工作的原因。这只是一个例子,为什么它不能与
replaceAll
@Arvind一起工作。是的,这是个好主意。没有其他简单的可能性吗o这样做吗?Morchul,不,@tobias_k所说的问题与你所说的不同。如果你不使用正则表达式,你根本不应该使用
replaceAll
。即使没有并行替换问题,
replaceAll
也不应该使用。使用
r=r可以节省几行代码eplacers.getOrDefault(c,c)
value -= 5 * 3 + (2 / 4)