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);
}
}
- Определите операции в вашем математическом уравнении
+ - * / ()
так далее - Преобразовать строку уравнения в
char[]
- Пройдите через
char[]
один символ за раз и добавить прочитанный символ кStringBuilder
объект. - Если вы встретите какой-либо символ, соответствующий определенным операциям, добавьте пробел до и после этого символа, а затем добавьте его к
StringBuilder
объект.
Ну, это один из алгоритмов, который вы можете реализовать. Могут быть и другие способы сделать это.