Лучший способ изменить операторы в строке на их противоположность - PullRequest
0 голосов
/ 29 мая 2018

У меня есть строка, например: 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 ]

0 голосов
/ 29 мая 2018

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

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)
0 голосов
/ 29 мая 2018

Почему бы просто не перебрать строку char-by-char и заменить одну букву за раз, чтобы избежать такого хаоса?

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);
    }
0 голосов
/ 29 мая 2018

Я думаю, что простой цикл будет работать;

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


    }

}
0 голосов
/ 29 мая 2018

Вам, вероятно, лучше просто перебрать значения, возможно, в массиве 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)

0 голосов
/ 29 мая 2018

Вы могли бы сначала заменить ваши символы (+, -, ...) на некоторые другие, которые не могут присутствовать в вашем выражении, например + -> A, -> B, ... и чем все, что касается -,Bs к +, ...Другим вариантом является создание массива символов из вашей строки, а затем итерация этого массива инвертирует ваши символы на месте.и затем создайте строку снова.

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