我正在尝试编写一个以字符串作为输入的程序。
此字符串必须是仅包含括号,操作或数字的等式。
我在下面发布的代码是我提出的,但是当我运行它时,我输入的任何内容显然都是无效的字符串。有人可以告诉我做错了吗?
System.out.println("Enter a string");
String str = s.nextLine(); //s is a Scanner object
int n = str.length();
for(int i = 0; i < n; i++) {
if( !Character.isDigit(str.charAt(i)) || str.charAt(i) != '+'
|| str.charAt(i) != '-' || str.charAt(i) != '*'
|| str.charAt(i) != '/' || str.charAt(i) != '('
|| str.charAt(i) != ')' || str.charAt(i) != '['
|| str.charAt(i) != ']' || str.charAt(i) != '{'
|| str.charAt(i) != '}') {
System.out.println("invalid string, try again: ");
str = s.nextLine();
}
...}
答案 0 :(得分:3)
根据评论中的建议,为||
切换&&
:
if( !Character.isDigit(str.charAt(i)) && str.charAt(i) != '+'
&& str.charAt(i) != '-' && str.charAt(i) != '*'
&& str.charAt(i) != '/' && str.charAt(i) != '('
&& str.charAt(i) != ')' && str.charAt(i) != '['
&& str.charAt(i) != ']' && str.charAt(i) != '{'
&& str.charAt(i) != '}') {
System.out.println("invalid string, try again: ");
str = s.nextLine();
}
或者,为了让您的代码更容易理解:
final String validChars = "0123456789+-*/()[]{}";
for(int i = 0; i < n; i++) {
if(!validChars.contains(str.charAt(i))) {
System.out.println("invalid string, try again: ");
str = s.nextLine();
// potential bug here - i and n are not being reset
}
}
注意:您有一个错误,在您从扫描仪中读取新行时,您不会重置i
索引或n
长度前一行包含无效字符的位置(请参阅上面代码中的注释)。
答案 1 :(得分:1)
如果您不想更改所有代码,可以:
System.out.println("Enter a string");
String str = s.nextLine(); // s is a Scanner object
int n = str.length();
if (n > 0) {
for (int i = 0; i < n; i++) {
if (!(Character.isDigit(str.charAt(i)) || str.charAt(i) == '+' || str.charAt(i) == '-'
|| str.charAt(i) == '*' || str.charAt(i) == '/' || str.charAt(i) == '(' || str.charAt(i) == ')'
|| str.charAt(i) == '[' || str.charAt(i) == ']' || str.charAt(i) == '{'
|| str.charAt(i) == '}')) {
System.out.println("invalid string, try again: ");
str = s.nextLine();
n = str.length();
i = -1;//reset i for the new line ( set at -1 for the next i++ of the next loop )
}
}
} else {
System.out.println("empty string ");
}
答案 2 :(得分:0)
package hello;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
public class Characts {
@Test
public void testSwitch () {
assertTrue(isValid("123+321*"));
assertFalse(isValid("A123+321*"));
assertTrue(isValid("123+321*\n")); // don't forget returns and line feeds
}
private boolean isValid(String str) {
for (int i = 0 ; i < str.length(); i++) {
char s = str.charAt(i);
if (Character.isDigit(s)) {
continue;
} else {
switch (s) {
case '+' :
case '-' :
case '*' :
case '/' :
case '(' :
case ')' :
case '[' :
case ']' :
case '{' :
case '}' :
continue;
}
return false;
}
}
return true;
}
}