如何将大括号中的内容提取到arraylists

时间:2018-11-01 13:32:20

标签: java

我需要提取大括号之间的字符串,例如{3{4 5}6}

然后

  • 列表A包含3和6
  • 列表B包含4和5
  • 列表C包含列表A和B

我曾尝试删除大括号,但只有在只有一对大括号时,我才能设法做到。当我有类似上面示例的内容时,它只是进入一个列表,而列表B为空。

1 个答案:

答案 0 :(得分:0)

为了将列表与列表的花括号分开,您可以遵循一种简单的基于堆栈的算法来生成列表的最终列表。

请注意,当您输入以下字符串时,

"{3 {4 5} 6 { 5 6 7 8 9} 1 1 1 1}"

,然后从第一个字符开始遍历,您会发现,每次遇到像“ {”这样的大括号时,都必须开始一个新列表。同样,当遇到右括号“}”时,您必须关闭以前正在构造的先前打开的列表。

例如,该算法将运行如下内容:

"{3 {4 5} 6 { 5 6 7 8 9} 1 1 1 1}"     |          | 
 ^                                     |          |
                                       |    []    | //push new list because you found a '{'
                                         stack

"{3 {4 5} 6 { 5 6 7 8 9} 1 1 1 1}"     |          | 
  ^                                    |          |
                                       |    [3]   | //push 3 to topmost list
                                         stack

"{3 {4 5} 6 { 5 6 7 8 9} 1 1 1 1}"     |          | 
    ^                                  |    []    |
                                       |    [3]   | //push new list because you found a '{'
                                         stack

"{3 {4 5} 6 { 5 6 7 8 9} 1 1 1 1}"     |          | 
     ^                                 |    [4]   |
                                       |    [3]   | // push 4 to topmost list
                                         stack

"{3 {4 5} 6 { 5 6 7 8 9} 1 1 1 1}"     |          | 
       ^                               |    [4 5] |
                                       |    [3]   | //push 5 to topmost list
                                         stack

"{3 {4 5} 6 { 5 6 7 8 9} 1 1 1 1}"     |          | 
        ^                              |          | //pop [4 5] and store it
                                       |    [3]   | //because you found a '}'   
                                         stack

... and so on

这是该算法的简单实现。请注意,它仅适用于所有括号均已平衡的输入:

import java.util.*;

public class MyClass {
    public static void main(String args[]) {
        String input = "{3 {4 5} 6 { 5 6 7 8 9} 1 1 1 1}";
        ArrayList<ArrayList<Integer>> result = getLists(input);

        for (List<Integer> l1 : result) {
           for (Integer n : l1) {
               System.out.print(n + " "); 
           }

            System.out.println();
        } 
    }

    public static ArrayList<ArrayList<Integer>> getLists(String s){
        s = s.replaceAll(" ", "");
        ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
        ArrayDeque<ArrayList<Integer>> stack = new ArrayDeque<ArrayList<Integer>>();

        for(int i=0;i<s.length();i++){
            if(s.charAt(i) == '{'){
                //add new list to stack
                ArrayList<Integer> list = new ArrayList<Integer>();
                stack.push(list);
            }
            else if(s.charAt(i) == '}'){
                //pop topmost list from stack and add to result
                result.add(stack.pop());
            }else{
                stack.peek().add(Character.getNumericValue(s.charAt(i)));
            }

        }

        return result;
    }

}

上述算法的输出:

4 5 
5 6 7 8 9 
3 6 1 1 1 1