Я не проверял это - но он должен дать вам общее представление о направлении, в котором вы должны идти.
Чтобы это сработало, я собираюсь предположить несколько вещей о тексте TextView
:
-
TextView
состоит из строк, разделенных "\n"
.
- Первая строка не будет содержать оператор (+, -, * или /).
- После первой строки может быть переменное количество строк в
TextView
, которое будет включать в себя один оператор и один число.
- Оператор всегда будет первым
Char
строки.
Сначала мы получаем текст:
String input = tv1.getText().toString();
Затем мы разбиваем его на каждую строку:
String[] lines = input.split( "\n" );
Теперь нам нужно вычислить общую стоимость:
int total = Integer.parseInt( lines[0].trim() ); //We know this is a number.
for( int i = 1; i < lines.length(); i++ ) {
total = calculate( lines[i].trim(), total );
}
Метод вычисления должен выглядеть следующим образом, предполагая, что мы знаем, что первая Char
строки является оператором:
private int calculate( String input, int total ) {
switch( input.charAt( 0 ) )
case '+':
return total + Integer.parseInt( input.substring( 1, input.length() );
case '-':
return total - Integer.parseInt( input.substring( 1, input.length() );
case '*':
return total * Integer.parseInt( input.substring( 1, input.length() );
case '/':
return total / Integer.parseInt( input.substring( 1, input.length() );
}
EDIT
Таким образом, вышеприведенное, как указано в комментарии ниже, выполняет вычисление «слева направо», игнорируя нормальный порядок (+ и / перед + и -).
Правильно рассчитывается следующее:
String input = tv1.getText().toString();
input = input.replace( "\n", "" );
input = input.replace( " ", "" );
int total = getValue( input );
Метод getValue
является рекурсивным методом и должен выглядеть следующим образом:
private int getValue( String line ) {
int value = 0;
if( line.contains( "+" ) ) {
String[] lines = line.split( "\\+" );
value += getValue( lines[0] );
for( int i = 1; i < lines.length; i++ )
value += getValue( lines[i] );
return value;
}
if( line.contains( "-" ) ) {
String[] lines = line.split( "\\-" );
value += getValue( lines[0] );
for( int i = 1; i < lines.length; i++ )
value -= getValue( lines[i] );
return value;
}
if( line.contains( "*" ) ) {
String[] lines = line.split( "\\*" );
value += getValue( lines[0] );
for( int i = 1; i < lines.length; i++ )
value *= getValue( lines[i] );
return value;
}
if( line.contains( "/" ) ) {
String[] lines = line.split( "\\/" );
value += getValue( lines[0] );
for( int i = 1; i < lines.length; i++ )
value /= getValue( lines[i] );
return value;
}
return Integer.parseInt( line );
}
Особые случаи, которые рекурсивный метод не обрабатывает:
- Если первое число отрицательное, например, -3 + 5 * 8.
- Двойные операторы, например 3 * -6 или 5 / -4.
Также тот факт, что мы используем Integers
, может дать некоторые "странные" результаты в некоторых случаях, например, например. 5/3 = 1.