Java 字符串中的表达式到arraylist
我是java和编程的初学者。 我有一个字符串Java 字符串中的表达式到arraylist,java,arrays,regex,string,Java,Arrays,Regex,String,我是java和编程的初学者。 我有一个字符串s=“((1+2))-((5+6))-((10+20))-((6-18))+((9+10))” 我想把它放入一个列表或数组中 像这样的, 执行时 char[]a=String.valueOf((((1+2))-((5+6))-((10+20))-((6-18))+((9+10))))”).tocharray() 结果是 [(,(,(,(,1,+,2,),),-,(,(,5,+,6,,),,-,(,(,1,0,+,2,0,,),,,-,(,(,6,-,
s=“((1+2))-((5+6))-((10+20))-((6-18))+((9+10))”
我想把它放入一个列表或数组中
像这样的,
执行时
char[]a=String.valueOf((((1+2))-((5+6))-((10+20))-((6-18))+((9+10))))”).tocharray()代码>
结果是
[(,(,(,(,1,+,2,),),-,(,(,5,+,6,,),,-,(,(,1,0,+,2,0,,),,,-,(,(,6,-,1,8,),,,,,,(,,9,+,1,0,,),)]
请注意,10表示1和0
编辑:
我想把它放到一个字符串列表中
像这样的,
列表ls=[(,(,(,1,+,2,),),-,(,(,5,+,6,,),,-,(,(,10,+,20,),,,,,-,(,,(,6,-,18,),,,,,,,,,,(,9,+,10,,,),)]
有人能告诉我怎么做吗?因为问题限于正数:
- 第一种方式:
使用正则表达式查找与
(
或)
或+
或-
或*
或\
或至少一个数字字符相匹配的每个字符串组
- 第二种方式:
在需要时使用和拆分字符串
- 前面不是数字,后面不是数字
- 或者前面是数字,后面不是数字
- 或者前面不是数字,后面是数字
- 第三条道路:
对字符进行迭代
- 如果不是数字,则输入列表李>
- 否则,循环获取完整的数字
代码示例:
public static void main(String[] args) {
String example = "(((1+2))-((5+6))-((10+20))-((6-18))+((9+10)))";
List<String> firstList = new ArrayList<>();
Pattern pattern = Pattern.compile("\\(|\\)|\\+|\\-|\\*|\\\\|\\d+"); // the back slashes are used for escaping
Matcher matcher = pattern.matcher(example);
while (matcher.find()) {
firstList.add(matcher.group());
}
// second way:
List<String> secondList = Arrays.asList(
example.split("(?<!\\d)(?!\\d)|(?<=\\d)(?!\\d)|(?<!\\d)(?=\\d)"));
// third way
List<String> thirdList = new ArrayList<>();
char[] chars = example.toCharArray();
for (int index = 0; index < chars.length; ) {
if (!Character.isDigit(chars[index])) {
thirdList.add(String.valueOf(chars[index])); // put into list if not digit
index++;
} else {
StringBuilder stringBuilder = new StringBuilder();
while (Character.isDigit(chars[index])) { // loop to get a complete number
stringBuilder.append(chars[index]);
index++;
}
thirdList.add(stringBuilder.toString());
}
}
}
publicstaticvoidmain(字符串[]args){
字符串示例=“((1+2))-((5+6))-((10+20))-((6-18))+((9+10))”;
List firstList=新建ArrayList();
Pattern Pattern=Pattern.compile(“\\(\\\)\\+\\\\+\\-\\\*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Matcher Matcher=pattern.Matcher(示例);
while(matcher.find()){
add(matcher.group());
}
//第二种方式:
List secondList=Arrays.asList(
示例.split(“(?作为替代方案,我提供了一个不使用正则表达式的解决方案:
public static List<String> split(String str) {
List<String> res = new ArrayList<>();
StringBuilder buf = null;
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if (ch >= '0' && ch <= '9') {
if (buf == null)
buf = new StringBuilder();
buf.append(ch);
} else {
if (buf != null) {
res.add(buf.toString());
buf = null;
}
res.add(String.valueOf(ch));
}
}
if (buf != null)
res.add(buf.toString());
return Collections.unmodifiableList(res);
}
公共静态列表拆分(字符串str){
List res=new ArrayList();
StringBuilder buf=null;
对于(int i=0;i 如果(ch>='0'&&ch如果你把它放在一个字符串中,你可以使用它。@vincrichaud似乎有点太琐碎了,无法回答。我想这条评论可能会从OP中引出更多的要求。@Andreas请删除重复标记,因为OP不想只将其转换为字符数组,这是有限制的。@Rowen所以你不想要字符数组。你需要吗要将字符串拆分为可能单个长度超过一个字符的元素。@Rowen您应该知道10
不是字符。如果尝试char ss='10'
,则会出现编译错误。您的解决方案比我自己提出的解决方案要好(逐字符迭代并连接数字).干得好!不过这种方法要慢得多。