2016-01-03 3 views
2

Я пытаюсь написать equals функция переопределения. Я думаю, что я написал правильно, но проблема в том, что разбор выражения. У меня есть тип массива ArrayList<String>, который требует ввода с клавиатуры, чем оценка результата. Я мог бы сравнить с другой переменной ArrayList<String>, но как я могу сравнить ArrayList<String> с String. Например,простой математический анализ выражений

String expr = "(5 + 3) * 12/3"; 
ArrayList<String> userInput = new ArrayList<>(); 
userInput.add("("); 
userInput.add("5"); 
userInput.add(" "); 
userInput.add("+"); 
userInput.add(" "); 
userInput.add("3"); 
. 
. 
userInput.add("3"); 
userInput.add(")"); 

затем преобразовать UserInput в строку затем сравнить с использованием равных Как вы видите, что это слишком долго, когда тест хотел применить. Я использовал для разделения, но он также разбивает комбинированные числа. как 12 к 1 и 2

public fooConstructor(String str) 
{ 
    // ArrayList<String> holdAllInputs; it is private member in class 
    holdAllInputs = new ArrayList<>(); 

    String arr[] = str.split(""); 

    for (String s : arr) { 
     holdAllInputs.add(s); 
    } 
} 

Как вы ожидаете, что не дает нужного результата. Как это можно исправить? Или может кто-то помочь в написании регулярного выражения, чтобы правильно разобрать его по мере необходимости? Как выход я получаю:

(,5, ,+, ,3,), ,*, ,1,2, ,/, ,3 

вместо

(,5, ,+, ,3,), ,*, ,12, ,/, ,3 
+0

Как вы добавляете 12? 'userInput.add (" 12 ");' или 'userInput.add (" 1 ");' 'userInput.add (" 2 ");'? – Guy

+0

'userInput.add (" 12 ");' @guy – askque

ответ

3

Regular Expression, который помогает вам в этом.

"(?<=[-+*/()])|(?=[-+*/()])" 

и, конечно же, вам необходимо избегать нежелательных пробелов.

Здесь мы идем,

String expr = "(5 + 3) * 12/3"; 
. 
. // Your inputs 
. 
String arr[] = expr.replaceAll("\\s+", "").split("(?<=[-+*/()])|(?=[-+*/()])"); 
for (String s : arr) 
{ 
    System.out.println("Element : " + s); 
} 

Пожалуйста, смотрите мой expiriment: http://rextester.com/YOEQ4863

Надеется, что это помогает.

0
this makes all the inputs into one string which can then be can be compared against the expression to see if it is equal 

String x = "";  

for(int i = 0; i < holdAllInputs.length; i++){ 
    x = x + holdAllInputs.get(i); 
} 

if(expr == x){ 
    //do something equal 
}else{ 
    //do something if not equal 
} 
0

Вместо того, чтобы расколоть ввода в лексемы, для которых у вас нет регулярных выражений, было бы хорошо, чтобы двигаться вперед с присоединением к строкам в Списке, например:

StringBuilder sb = new StringBuilder(); 
for (String s : userInput) 
{ 
    sb.append(s); 
} 

затем используйте sb.toString() позже для сравнения. Я бы не советовал конкатенации строк, используя + данные оператора here.

Другим подходом к этому было бы использование одного из методов StringUtils.join в Apache Commons Lang.

import org.apache.commons.lang3.StringUtils; 

String result = StringUtils.join(list, ""); 

Если вы достаточно удачливы, чтобы быть с помощью Java 8, то это еще проще ... просто использовать String.join

String result = String.join("", list); 

Более подробную информацию об этом подходе доступный here

+0

моя проблема не связана с переменной ArrayList, это о строковой переменной в fooConstructor. После синтаксического анализа строки я смогу построить, а затем сравнить. – askque

+0

Вот что я хотел сказать. Не разбирайте переменную String в 'fooConstructor'. Вместо этого объедините строки в списке, чтобы выполнить сравнение. (Если вы не хотите использовать некоторое регулярное выражение, которое трудно переварить) –

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