我需要提取大括号之间的字符串,例如{3{4 5}6}
然后
我曾尝试删除大括号,但只有在只有一对大括号时,我才能设法做到。当我有类似上面示例的内容时,它只是进入一个列表,而列表B为空。
答案 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