从字符串中提取整数和字符
Extraction of integers and characters from String
我正在使用堆栈数据结构解决数学表达式问题,但我无法从字符串中提取数字和数学符号。我想做的是制作一个程序来评估给定的表达式。
我的问题是,如何将字符串中的所有数字和符号提取到新的字符串数组中?
Input: 12*1*145*2+8*1*1+2*3+2+4
新的字符串数组应该是:
String[] expArray={"12","*","1","*","145","*","2","+","8","*","1","*","1","+","2","*","3","+","2","+","4"}
我尝试使用 nextInt()
、split()
、next()
、nextByte()
,但没有成功。不要担心其他任何事情。我刚才提到这个问题只是为了清楚我在说什么。
更新:我不需要构建整数的解决方案,例如 array[i]*10+array[i+1]
或类似的东西。我需要的是更优的方案。
但既然其他人可能感兴趣,我还是发了。
import java.util.*;
public class Test {
public static void main(String... args) {
String s = "12*1*145*2+8*1*1+2*3+2+4";
List<String> tokens = new ArrayList<>();
// for building numbers
StringBuilder builder = new StringBuilder();
// assume there are only 2 types (number and operators)
boolean isNumber = false;
for (char c : s.toCharArray()) {
if (Character.isDigit(c)) {
if (!isNumber) {
builder = new StringBuilder();
isNumber = true;
}
builder.append(c);
} else {
if (isNumber) {
tokens.add(builder.toString());
isNumber = false;
}
// assume operators are exactly 1 char
tokens.add(String.valueOf(c));
}
}
if (isNumber)
tokens.add(builder.toString());
System.out.println(tokens);
}
}
输出:
[12, *, 1, *, 145, *, 2, +, 8, *, 1, *, 1, +, 2, *, 3, +, 2, +, 4]
一种更通用的方法是使用 enum
类型来保持当前状态而不是 boolean
,并对所有类型使用 builder
以便它们的标记是不限于 1 个字符。
然后你可能需要构建一个 AST…
其他人使用 Regex 的解决方案:
String inputStr = "12*1*145*2+8*1*1+2*3+2+4";
String inputPattern = "(\d+|[+-/*]{1})";
List<String> strList=new ArrayList<>();
Pattern patternObj = Pattern.compile(inputPattern);
Matcher matcherObj = patternObj.matcher(inputStr);
while (matcherObj.find()) {
strList.add(matcherObj.group(0));
}
System.out.println(strList);
我正在使用堆栈数据结构解决数学表达式问题,但我无法从字符串中提取数字和数学符号。我想做的是制作一个程序来评估给定的表达式。
我的问题是,如何将字符串中的所有数字和符号提取到新的字符串数组中?
Input: 12*1*145*2+8*1*1+2*3+2+4
新的字符串数组应该是:
String[] expArray={"12","*","1","*","145","*","2","+","8","*","1","*","1","+","2","*","3","+","2","+","4"}
我尝试使用 nextInt()
、split()
、next()
、nextByte()
,但没有成功。不要担心其他任何事情。我刚才提到这个问题只是为了清楚我在说什么。
更新:我不需要构建整数的解决方案,例如 array[i]*10+array[i+1]
或类似的东西。我需要的是更优的方案。
但既然其他人可能感兴趣,我还是发了。
import java.util.*;
public class Test {
public static void main(String... args) {
String s = "12*1*145*2+8*1*1+2*3+2+4";
List<String> tokens = new ArrayList<>();
// for building numbers
StringBuilder builder = new StringBuilder();
// assume there are only 2 types (number and operators)
boolean isNumber = false;
for (char c : s.toCharArray()) {
if (Character.isDigit(c)) {
if (!isNumber) {
builder = new StringBuilder();
isNumber = true;
}
builder.append(c);
} else {
if (isNumber) {
tokens.add(builder.toString());
isNumber = false;
}
// assume operators are exactly 1 char
tokens.add(String.valueOf(c));
}
}
if (isNumber)
tokens.add(builder.toString());
System.out.println(tokens);
}
}
输出:
[12, *, 1, *, 145, *, 2, +, 8, *, 1, *, 1, +, 2, *, 3, +, 2, +, 4]
一种更通用的方法是使用 enum
类型来保持当前状态而不是 boolean
,并对所有类型使用 builder
以便它们的标记是不限于 1 个字符。
然后你可能需要构建一个 AST…
其他人使用 Regex 的解决方案:
String inputStr = "12*1*145*2+8*1*1+2*3+2+4";
String inputPattern = "(\d+|[+-/*]{1})";
List<String> strList=new ArrayList<>();
Pattern patternObj = Pattern.compile(inputPattern);
Matcher matcherObj = patternObj.matcher(inputStr);
while (matcherObj.find()) {
strList.add(matcherObj.group(0));
}
System.out.println(strList);