Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 字符串中的表达式到arraylist_Java_Arrays_Regex_String - Fatal编程技术网

Java 字符串中的表达式到arraylist

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,-,

我是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,-,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'
,则会出现编译错误。您的解决方案比我自己提出的解决方案要好(逐字符迭代并连接数字).干得好!不过这种方法要慢得多。