代码之家  ›  专栏  ›  技术社区  ›  Morchul drojokef

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

  •  -1
  • Morchul drojokef  · 技术社区  · 6 年前

    我有一根绳子,像: value += 5 * 3 - (2 / 4) 例如。

    现在我必须把所有的操作符都改成相反的,所以:
    + -
    -+
    *对/
    / *

    我的问题是当我使用 replaceAll() 功能

    第一次: string.replaceAll("+", "-"); 我变成了: value -= 5 * 3 - (2 / 4)

    第二次: string.replaceAll("-", "+"); 我变成了: value += 5 * 3 + (2 / 4)
    但必须是: value -= 5 * 3 + (2 / 4)

    我怎么能做到?

    5 回复  |  直到 6 年前
        1
  •  2
  •   Nebula    6 年前

    您可以使用以下字符创建一个映射来替换和迭代字符串:

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

    这将打印出:

    value -= 5 * 3 + (2 / 4)
    
        2
  •  2
  •   user2575725    6 年前

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

    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);
        }
    
        3
  •  1
  •   Michal    6 年前

    您可以先将符号(+、-、…)替换为表达式中不能出现的其他符号,例如:+->a、->b,…比所有的关于-的,从B到+的…. 另一个选项是从字符串中创建字符数组,然后迭代该数组,将符号就地反转。然后再创建一个字符串。

        4
  •  1
  •   Lone_Coder    6 年前

    我认为一个简单的循环是可行的;

    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
    
    
        }
    
    }
    
        5
  •  1
  •   achAmháin    6 年前

    你最好只是循环使用这些值,或者 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]);
        }
    }
    

    输出:

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