JAVA: пробел, разделяющий все нечисловые символы в строке

У меня возникли некоторые проблемы с изменением строк в качестве разделителя пробелов в особом случае добавления пробелов ко всем нечисловым символам.

Мой код должен взять строку, представляющую математическое уравнение, и разбить его на отдельные части. Это делается с использованием пробелов между значениями. Эта часть прекрасно работает, если строка уже разделена. Проблема в том, что я не всегда получаю ввод через пробел. Чтобы справиться с этим, я хочу сначала вставить эти пробелы, чтобы массив был создан правильно.

Мой код должен взять любой символ, который НЕ является числом, и добавить пробел до и после него.

Примерно так: 3*24+321 становится 3 * 24 + 321 или ((3.0)*(2.5)) становится ((3.0)*(2.5))

Очевидно, что мне нужно избегать вставки пробела в числах, или 2,5 становится 2 . 5, а затем вводится в массив как 3 элемента. что это не так.

До сих пор я пытался использовать

String InputLineDelmit = InputLine.replaceAll("\B", " ");

который успешно изменяет строку из всех букв "abcd" на "abcd", но он допускает ошибки, когда сталкивается с числами. Используя этот метод, я получил, что:

(((1) * (2))) становится ( ( (1) * (2))) ---- * Числа должны быть отделены от паренов

12,7+3,1 становится 1 2,7+3,1 ----- * 12,7 делится

51/3 становится 5 1/3 ----- * тот же вопрос

и 5*4-2 не меняется вообще.

Итак, я знаю, что \D можно использовать как регулярное выражение для всех не чисел в Java. Тем не менее, мои попытки реализовать это (путем замены или объединения с \ B выше) привели либо к ошибкам компилятора, либо к ЗАМЕНЕ символа в пробеле, а не к добавлению.

РЕДАКТИРОВАТЬ:

==== ответил! ====

Это не позволит мне добавить свой собственный ответ, потому что я новичок, но изменение кода neo108 ниже (которое само по себе не работает) сделало свою работу. Что я сделал, так это изменил его, чтобы проверить isDigit, а не isLetter, а затем ничего не делать в этом случае (или в особом случае десятичного числа, для двойников). Иначе, персонаж изменяется, чтобы с обеих сторон были пробелы.

public static void main(String[] args){


    String formula = "12+((13.0)*(2.5)-17*2)+(100/3)-7";

    StringBuilder builder = new StringBuilder();

    for (int i = 0; i < formula.length(); i++){

        char c = formula.charAt(i);
        char cdot = '.';

        if(Character.isDigit(c) || c == cdot) {
        builder.append(c);
        }
        else {
        builder.append(" "+c+" ");
        }
    }   

    System.out.println("OUTPUT:" + builder);


}

ВЫХОД: 12 + ( ( 13,0) * (2,5) - 17 * 2) + ( 100 / 3) - 7

Тем не менее, любые идеи о том, как сделать это более кратко, а также достойное объяснение StringBuilders, будут оценены. А именно, что с этим пределом в 16 символов, о котором я читал на javadocs, как показано в примере выше, что вы МОЖЕТЕ иметь больше вывода.

2 ответа

Решение

Как-то так должно работать...

String formula = "Ab((3.0)*(2.5))";
StringBuilder builder = new StringBuilder();
for (int i = 0; i < formula.length(); i++){
    char c = formula.charAt(i);
    if(Character.isLetter(c)) {
        builder.append(" "+c+" ");
    } else {
        builder.append(c);
    }
}
  1. Определите операции в вашем математическом уравнении + - * / () так далее
  2. Преобразовать строку уравнения в char[]
  3. Пройдите через char[] один символ за раз и добавить прочитанный символ к StringBuilder объект.
  4. Если вы встретите какой-либо символ, соответствующий определенным операциям, добавьте пробел до и после этого символа, а затем добавьте его к StringBuilder объект.
    Ну, это один из алгоритмов, который вы можете реализовать. Могут быть и другие способы сделать это.
Другие вопросы по тегам