根据递归取字符串每个大括号节点的值

原字符串: ss{0}123{style|测试{aa{vv}}}ddd{style|{0}}ssss

最终结果: [{0},{style|测试{aa{vv}}},{aa{vv}},{vv},{style|{0}},{0}]

 

java实现方式:               

	// 全局变量
	private static List<String> strResult = new ArrayList<String>();

	// 递归方法
	public static void printAll(String src, boolean flag) {
		System.out.println(src+"    是否是第一次进递归方法 --:"+flag); // 打印每次进来的值
		if (!flag) {
			strResult.add("{" + src + "}");// 这里需要补括号
		}
		List<String> list = getSons(src);
		for (String s : list) {
			printAll(s, false);
		}
	}

	// 拆分方法
	public static List<String> getSons(String src) {
		List<String> list = new ArrayList<String>();
		StringBuilder sb = new StringBuilder();
		// 是否找到左括号标识
		boolean start = false;
		// 括号叠加层数
		int deep = 0;
		for (char c : src.toCharArray()) {
			if (!start) { // 先让程序进来 为了寻找第一个左括号
				if (c == '{') {
					start = true; // 找到了左括号
					deep++; // 遇到左括号就+1 括号数量递增
				}
				continue;
			} else {
				if (c == '{') {
					deep++; // 遇到左括号就+1 括号数量递增
					sb.append(c);
				} else if (c == '}') {
					deep--; // 遇到右括号就-1 括号数量递增
					if (deep == 0) { // 直到等于零 就说明找到结尾了
						list.add(sb.toString()); // 添加到集合
						start = false; // 置为fasle 开始下一轮寻找
						sb = new StringBuilder(); // 重置
					} else {
						sb.append(c);
					}
				} else { // 已经找到了起始左括号 并且不是左括号也不是右括号那就是括号中间的数据 直接拼接起来
					sb.append(c);
				}
			}
		}
		return list;
	}

	public static void main(String[] args) {
		printAll("ss{0}123{style|测试{aa{vv}}}ddd{style|{0}}ssss", true);
		System.out.println("最终结果:   "+strResult.toString());
	}

控制台输出:


ss{0}123{style|测试{aa{vv}}}ddd{style|{0}}ssss  是否是第一次进递归方法 --:true
0                                              是否是第一次进递归方法 --:false
style|测试{aa{vv}}                              是否是第一次进递归方法 --:false
aa{vv}                                         是否是第一次进递归方法 --:false
vv                                             是否是第一次进递归方法 --:false
style|{0}                                      是否是第一次进递归方法 --:false
0                                              是否是第一次进递归方法 --:false
最终结果:   
         [{0}, {style|测试{aa{vv}}}, {aa{vv}}, {vv}, {style|{0}}, {0}]

参考来源: https://ask.csdn.net/questions/672647?ref=myrecommend

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值