我正在尝试将表达式字符串解析为单个令牌单元以放入数组列表中。所以基本上,我给出了这样一个表达式:
(3 + 5)
一旦完成解析,它应该在数组列表中看起来像这样:
"(", "3", "+", "5", ")"
在这种情况下,应忽略空格。此外,如果表达式包含像“++”或“ - ”这样的运算符,它们应该存储为一个标记,而不是两个。例如,(++ 3)将会出现“(”,“++”,“3”,“)”。
我不确定我的方法是否正确,但我在想的是使用for循环遍历每个角色并查看它是否匹配。
更新:
for(int i=0; i<expressionString.length(); i++) {
//cast char into ascii int
int ascii = (int) charAt(i);
//appending to token if one of operator symbols
if( ascii >= 40 && ascii <= 47 || ascii == 91 || ascii == 93){
token.append((char) ascii);
//appending to token if it's a num
} else if ( ascii >= 48 || ascii <=57) {
token.append((char) ascii);
//check if next char is a num, if so, append to token
while ((int) charAt(i+1) >= 48 || (int) charAt(i+1) <=57) {
//increment i in for loop to check
i++;
token.append((int) charAt(i));
}
}
//
}
答案 0 :(得分:1)
我认为,你正在寻找的是toCharArray()
,这是最简单的解决方案,但是,如果有多个操作,它不会给你想要的输出
String str ="(3+5)";
str = str.replaceAll("\\s+",""); // remove all whitespaces
System.out.println(Arrays.toString(str.toCharArray()));
因此,您需要使用循环并继续检查具有下一个字符的字符,并在它们是相同类型时附加它们。然后,您需要ArrayList
,您将继续添加String
(到目前为止已添加)
List<String> lstStr = new ArrayList<>();
str= str.replaceAll("\\s+","");
StringBuilder temp = new StringBuilder();
int i;
for (i=0; i<str.length()-1; i++)
{
// actually we looking, if they are same type
if(Character.isDigit(str.charAt(i))==Character.isDigit(str.charAt(i+1)))
{
temp.append(str.charAt(i));
}
else
{
temp.append(str.charAt(i));
lstStr.add(temp.toString());
temp.setLength(0);// reset StringBuilder to re-use
}
}
temp.append(str.charAt(i));
lstStr.add(temp.toString());
System.out.println(Arrays.toString(lstStr.toArray()));
因为,我们实际上是循环到N-2
,其中N
是String
的长度,因此,我们需要将最后一个字符追加到StringBuilder
然后添加它到List
。
答案 1 :(得分:1)
以下是使用java.util.Scanner
的解决方案:
Scanner scanner = new Scanner("10++9+0-4");
// here I used regex that says "match any boundary or whitespace between an operator and a number"
// So the scanner will keep scanning until it reaches such a boundary, where it will return the result
scanner.useDelimiter("((?<=[+\\-*/])\\s*(?=\\d))|((?<=\\d)\\s*(?=[+\\-*/]))");
while (scanner.hasNext()) {
System.out.println(scanner.next());
}
试用正则表达式here。看看它是否将字符串拆分到您想要的位置。
答案 2 :(得分:0)
一个正在运行的解决方案
public class ParseInputString { public static void main(String args[]) { String a="(3 ++ 5)"; char [] arr=a.replaceAll("\\s+","").toCharArray(); Set<Character> charSet = new LinkedHashSet<Character>(); for (char c : arr) { charSet.add(c); } List<Character> arrrList=new ArrayList<Character>(); Iterator<Character> it = charSet.iterator(); while(it.hasNext()){ arrrList.add(it.next()); } System.out.println(arrrList); } }