首页 > 编程语言 >JAVA获取字符串内的括号对(支持多层级);获取括号对的内容;按指定规则返回括号对位置;

JAVA获取字符串内的括号对(支持多层级);获取括号对的内容;按指定规则返回括号对位置;

时间:2023-07-03 14:34:54浏览次数:48  
标签:JAVA linkedList 获取 括号 characterHashMap put new LinkedHashMap

先看结果:处理字符串 

"这个是一条测试用的字符串[  ( 5 ( 4( 3 [(1) (2)] ))(7))][(6)]"

结果   

解决思路:参考正则表达式里面出入站部分

 代码实现如下:

方法调用“: 

String test = "这个是一条测试用的字符串[  ( 5( 4( 3 [(1) (2)] ))(7))][(6)]";
LinkedHashMap<Integer, Integer> linkedHashMap = getBracketPairs(test, '(');
System.out.println(JSON.toJSONString(linkedHashMap));
//此处value+1可以 把)也打印出来 默认 substring 不包含右侧末尾位置
linkedHashMap.forEach((key, value) -> System.out.println(test.substring(key, value+1)));

 

    
/**
* <p> 获取对应的括号组位置 </p>
* 例如{37:39,26:28,43:45,30:32,21:35,18:36,15:40}
* @param string 字符串
* @param symbolLeft 左侧符号 内置三类 ( [ {
* @return {@link LinkedHashMap }<{@link Integer }, {@link Integer }>
* @author xhūnchéng Xú
* @since 0.0.1 2023-07-03
*/
private static LinkedHashMap<Integer, Integer> getBracketPairs(String string, Character symbolLeft) {
        Map<Character, Character> characterHashMap = new HashMap<>();
        characterHashMap.put('(', ')');
        characterHashMap.put('[', ']');
        characterHashMap.put('{', '}');
        Character symbolRight = characterHashMap.get(symbolLeft);
        if (symbolRight == null || symbolRight.toString().length() < 1) {
            return new LinkedHashMap<>();
        }
        char[] strArray = string.toCharArray();
        //找到所有左右()的位置
        ArrayList<Integer> right = new ArrayList<>();
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < strArray.length; i++) {
            if (strArray[i] == symbolLeft) {
                list.add(i);
            } else if (strArray[i] == symbolRight) {
                right.add(i);
                list.add(i);
            }
        }
        LinkedList<Integer> linkedList = new LinkedList<>();
        Map<Integer, Integer> integerMap = new HashMap<>();
        for (int a : list) {
            boolean contains = right.stream().anyMatch(x -> x == a);
            if (!contains) {
                linkedList.add(a);
            } else {
                if (linkedList.size() > 0) {
                    Integer leInt = linkedList.get(linkedList.size() - 1);
                    integerMap.put(leInt, a);
                    linkedList.removeLast();
                }
            }
        }
        return integerMap.entrySet().stream()
                .sorted((o1, o2) -> {
                    int c1 = o1.getValue() - o1.getKey();
                    int c2 = o2.getValue() - o2.getKey();
                    return Integer.compare(c1, c2);
                })
                .collect(LinkedHashMap::new, (map, entry) -> {
                    map.put(entry.getKey(), entry.getValue());
                }, LinkedHashMap::putAll);
    }

 由于目的是进行SQL脚本适配;当前排序只排序最小单元  可自定义按需配置 即 sorted  部分

参考文章思路:正则表达式匹配对称小括号 - 曹万军 - 博客园 (cnblogs.com)

标签:JAVA,linkedList,获取,括号,characterHashMap,put,new,LinkedHashMap
From: https://www.cnblogs.com/jiannanchun/p/17522414.html

相关文章

  • 41. Spring Boot 使用Java代码创建Bean并注册到Spring中【从零开始学Spring Boot】
    已经好久没有讲一些基础的知识了,这一小节来点简单的,这也是为下节的在Spring多数Boot中使用多数据源做准备。从Spring3.0开始,增加了一种新的途径来配置BeanDefinition,这就是通过JavaCode配置BeanDefinition。      与XML和Annotation两种配置方式不同点在于:      ......
  • 郑州Java面试题
    常见题库https://github.com/cosen1024/Java-Interviewhttps://github.com/whx123/JavaHomehttps://github.com/lvminghui/Java-Noteshttps://github.com/cosen1024/Java-Interview==和equals区别==基本类型比较的是值,对象类型比较的是地址,equals默认情况下也是比较地址......
  • JAVA生成xml文件格式
    publicboolean A(参数1,……){Documentdocument=DocumentHelper.createDocument();Namespacena=Namespace.get("");Strings=null;na=new Namespace(xxxxxxxxxxxxxxxxxxxxx);//命名空间Elementroot=document.addElement(newQName(“A......
  • java 相对路径问题 和绝对路径
    小例:java代码:都可以成功Filefile=newFile("./xml/a.properties");Filefile=newFile("xml/a.properties");下面就会出错Filefile=newFile("/xml/a.properties"); 总结:.为当前目录,即工程名所在文件夹  下面的当前路径都是你的工程目录Filefile=newFile("./......
  • 关于Java RDP协议实现远程桌面连接的开源项目properjavardp
    最近想学一下在Android平台上实现RDP协议远程连接PC,于是在网上找这方面的资料,发现了一个开源的JavaRDP项目,很不错,拿出来和大家分享一下。关于properjavardp的一些说明,可以到这里看看:http://properjavardp.sourceforge.net/ 。1、首先到http://sourceforge.net/projects/properjav......
  • JavaCV的摄像头实战之十三:年龄检测
    欢迎访问我的GitHub这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos本篇概览本文是《JavaCV的摄像头实战》系列的第十三篇,前文《JavaCV的摄像头实战之十二:性别检测》中,借助训练好的卷积神经网络模型开发出了识别性别的应用,今天在前文基础......
  • HTML+CSS+JavaScript基础
    1、HTML(HypertextMarkupLanguage,超文本标记语言),用来向浏览器说明内容的结构、2、DOM(DocumentObjectModel,文档对象模型)指的是HTML标签的层次结构。每一对HTML标签(有的时候是一个标签)都是一个元素。3、CSS(CascadingStyleSheets,层叠样式表),控制DOM元素的视觉外观......
  • JavaScript 拖拽
    <!DOCTYPEhtml><html> <head> <metacharset="UTF-8"> <title></title> <styletype="text/css"> #box1{ width:100px; height:100px; background-color:red; position:a......
  • JavaScript 事件的绑定
    <!DOCTYPEhtml><html> <head> <metacharset="UTF-8"> <title></title> <scripttype="text/javascript"> window.onload=function(){ /* *点击按钮以后弹出一个内容 */ //获取按钮......
  • JavaScript 事件的传播
    <!DOCTYPEhtml><html> <head> <metacharset="UTF-8"> <title></title> <styletype="text/css"> #box1{ width:300px; height:300px; background-color:yellowgreen; } ......