2017-01-24 20 views
-3

Я решаю проблему математического выражения, используя Stack Data Structure, и я застреваю при извлечении чисел и математических знаков из строки. Я хочу сделать, чтобы программа оценивала данное выражение.Извлечение целых чисел и символов из String

Мой вопрос в том, как извлечь все числа и знаки из строки в новый массив строк?

Input: 12*1*145*2+8*1*1+2*3+2+4 

Новая строка массива должна быть:

String[] expArray={"12","*","1","*","145","*","2","+","8","*","1","*","1","+","2","*","3","+","2","+","4"} 

Я попытался с nextInt(), split(), next(), nextByte(), но она не увенчалась успехом. Не беспокойтесь ни о чем другом. Я только что упомянул проблему, чтобы просто понять, о чем я говорю.

UPDATE: мне не нужно решение с целыми целыми числами, например array[i]*10+array[i+1] или что-то подобное. Мне нужно более оптимальное решение.

+0

Пожалуйста, оставьте @ редактировать MichaelLihs'S в месте, совершенно хорошо. – halfer

+0

Отмечено модератором для двух агрессивных откатов. – halfer

ответ

2

Но, поскольку другие могут быть заинтересованы, я все равно разместил.

import java.util.*; 

public class Test { 
    public static void main(String... args) { 
     String s = "12*1*145*2+8*1*1+2*3+2+4"; 
     List<String> tokens = new ArrayList<>(); 
     // for building numbers 
     StringBuilder builder = new StringBuilder(); 
     // assume there are only 2 types (number and operators) 
     boolean isNumber = false; 
     for (char c : s.toCharArray()) { 
      if (Character.isDigit(c)) { 
       if (!isNumber) { 
        builder = new StringBuilder(); 
        isNumber = true; 
       } 
       builder.append(c); 
      } else { 
       if (isNumber) { 
        tokens.add(builder.toString()); 
        isNumber = false; 
       } 
       // assume operators are exactly 1 char 
       tokens.add(String.valueOf(c)); 
      } 
     } 
     if (isNumber) 
      tokens.add(builder.toString()); 
     System.out.println(tokens); 
    } 
} 

Выход:

[12, *, 1, *, 145, *, 2, +, 8, *, 1, *, 1, +, 2, *, 3, +, 2, +, 4] 

Более общий подход будет использовать enum типов, чтобы сохранить текущее состояние вместо boolean и использовать builder для всех типов, так что их маркеры не являются ограниченный 1 символом.

Тогда вам, вероятно, нужно построить AST ...

+0

Большое спасибо, сэр. Это мне очень помогло. –

1

Раствор с помощью Regex для других:

String inputStr = "12*1*145*2+8*1*1+2*3+2+4"; 
String inputPattern = "(\\d+|[+-/*]{1})"; 

List<String> strList=new ArrayList<>(); 

Pattern patternObj = Pattern.compile(inputPattern); 
Matcher matcherObj = patternObj.matcher(inputStr); 


while (matcherObj.find()) {   
    strList.add(matcherObj.group(0)); 
} 

System.out.println(strList);