2012-03-09 5 views
2

У меня возникают проблемы с модификацией строк, которые должны быть разделены пробелом в специальном случае , добавляя пробелы ко всем нечисловым символам.JAVA: Пространство, ограничивающее все нечисловые символы в строке

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

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

Нечто подобное: 3 * 24 + 321 становится 3 * 24 + 321 или ((3,0) * (2.5)) становится равным ((3,0) * (2.5))

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

До сих пор я попытался с помощью

Строка InputLineDelmit = InputLine.replaceAll ("\ B", "«);

, который успешно меняет строку всех букв «abcd» на «a b c d» Но он совершает ошибки, когда он сталкивается с числами. Используя этот метод, я получил, что:

(((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 выше) привели либо к ошибкам компилятора, либо к ЗАМЕНЕ символа пробелом, а не добавлением одного.

EDIT:

==== Ответил! ====

Это не позволит мне добавить свой собственный ответ, потому что я новичок, но редактирование кода 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, как показано выше, показывает, что у вас может быть больше выходных данных.

+0

На самом деле, '\ PN' является нечисловой символ в регулярном выражении; '\ D' - это то же самое, что и' [^ 0-9] ', или же то же, что и' \ P {Nd} 'под флагом компиляции' Pattern.UNICODE_CHARACTER_CLASS' от Java 7. BTW, ваш '' \ B «' отсутствует обратная косая черта, потому что Java не имеет регулярных выражений 1-го класса. Вы имели в виду '' \\ B "' - то есть '\ B' - для неграничного? Обратите внимание, что границы Java прерваны до Java 7. – tchrist

+0

да, я имел в виду \\ B, это была опечатка. –

ответ

0

Что-то, как это должно работать ...

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

Неверная итерация: вы используете 'charAt', где вам нужно использовать' codePointAt' в коде общего назначения. И вам придется иногда нажимать «я» один раз. UTF-16 - это кодирование с переменной шириной, и ваш код плохо обрабатывает его, как если бы это был UCS-2. – tchrist

+0

Счастливый, чтобы увидеть ответ помог & грустно видеть, что вы не можете продвинуться! – neo108

+0

Да. Если мы рассмотрим ваше квалификационное заявление «Что-то, что НРАВИТСЯ», то да, вы правильно ответили на мой вопрос. –

-1
  1. Определение операции в вашем математическом уравнении + - * /() и т.д.
  2. Преобразование строки в уравнение char[]
  3. Traverse через char[] один полукокса в то время, и добавить считанную полукокса к StringBuilder объекта.
  4. Если вы столкнулись с любым символом, соответствующим определенным операциям, добавьте пробел до и после этого символа, а затем добавьте этот объект 0 StringBuilder.
    Ну, это один из алгоритмов, которые вы можете реализовать. Могут быть и другие способы сделать это.
+0

Нет, вы не переходите по строкам единицы единиц за раз. Вы проходите через них код-код за раз! – tchrist

Смежные вопросы