我没有测试过这个代码,但是它应该可以给你提供需要采取的方向。
为了使此代码生效,我将假设一些关于TextView
文本的内容:
TextView
由用"\n"
分隔的行组成。
- 第一行不包括运算符(+、-、*或/)。
- 在第一行后,
TextView
中可以有可变数量的行,这些行都将包括一个运算符和一个数字。
- 运算符将始终是行中的第一个
Char
。
首先,我们获取文本:
String input = tv1.getText().toString();
然后我们将其拆分为每一行:
String[] lines = input.split( "\n" );
现在我们需要计算总值:
int total = Integer.parseInt( lines[0].trim() );
for( int i = 1; i < lines.length(); i++ ) {
total = calculate( lines[i].trim(), total );
}
假设我们已知一行的第一个 Char
是运算符,那么方法 calculate 应该像这样:
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() );
}
编辑
根据下面的评论所述,上面的代码执行“从左到右”的计算,而忽略了正常的顺序(加号和除号在加减号之前计算)。
下面的代码按正确的方式进行计算:
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。
另外,我们使用整数可能会在某些情况下产生“奇怪”的结果,例如5/3=1。