我还没有对此进行测试 - 但它应该可以让您大致了解需要采取的方向。
为了实现这一点,我将假设一些关于文本的事情TextView
:
- The
TextView
由用分隔的行组成"\n"
.
- 第一行不包含运算符(+、-、* 或 /)。
- 第一行之后可以有可变数量的行
TextView
其中将全部包括one运算符和one number.
- 运营商永远是第一位
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。