• Java字符串分割


    故事的起因源于这样一道题
    leetcode: https://leetcode.cn/problems/most-common-word/
    我的思路: 分割字符串得到由各单词组成的数组, 用map统计各单词出现的次数,再排除在禁用列表中的单词

    遇到的问题 1:使用split分割字符串时,如何设置多个分割符

    解决

    1. 通过 | 隔开各分隔符
    String[] strArray = paragraph.split("!|\\?|'|,|;|\\.| ");
    
    • 1
    1. 使用[ ]包裹各分割符
    String[] strArray = paragraph.split("[!\\?',;\\. ]");
    
    • 1

    遇到的问题2: 转义字符有哪些,如何处理

    解决: . $、| * ?等, 在其前面加上 \

    遇到的问题3: split遇到连续的分割 符如何处理

    解决:split遇到连续的分割符,会在第一个分割符以后分隔符位置返回一个空格存入返回数组,而不是忽视连续的分割符。
    示例: str = “Bob…hit a ball”; str的分隔符为 . ,这时返回的结果数组中第二个.和第三个.位置的值为空格。

    遇到的问题4: 分隔符在首尾位置怎么处理

    解决: 分隔符在首位置时,会返回一空字符(“”)作为返回字符数组的0号元素 , 判断方法为:

    strArray[0].length() == 0
    
    • 1

    分隔符在尾位置时,直接忽略

    遇到的问题5: 字符串"" 和 null等价嘛?

    解决: 不等价, ““的判断方法为长度是否为0, null则是判断是否==null
    使用new String()创建字符串,而未赋值时, 此时字符串的值就是””, 这样的字符串已经被开辟出了属于自己空间。而null值的字符串,在内存中无其存在的空间

    所有问题解决了,代码也就简单了

    class Solution {
         public String mostCommonWord(String paragraph, String[] banned) {
                String[] strArray = paragraph.split("!|\\?|'|,|;|\\.| ");
                String ans = "";
                for(int k=0; k<strArray.length; k++){
                    strArray[k] = strArray[k].toLowerCase();
                }
                Map<String, Integer> map = new HashMap<>();
                for(int i=0; i<strArray.length; i++){
                    if(strArray[i] != " " && strArray[i].length() != 0) {
                            if (map.containsKey(strArray[i])) {
                                map.replace(strArray[i], map.get(strArray[i]) + 1);
                            } else {
                                int flag = 0;
                                for (int j = 0; j < banned.length; j++) {
                                    if (strArray[i].equals(banned[j])) {
                                        flag = 1;
                                        break;
                                    }
                                }
                                if (flag == 0) {
                                    map.put(strArray[i], 1);
                                }
                            }
                    }
                }
                int max = Integer.MIN_VALUE;
                for(Map.Entry<String, Integer> entry: map.entrySet()){
                    if(entry.getValue() > max ){
                        max = entry.getValue();
                        ans = entry.getKey();
                    }
                }
                return ans;
            }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    附加: 本人也采用了StringTokenizer的方式试着解决这道题,StringTokenize进行分割时,分隔符直接被忽略,不会出现split中结果含空格字符串和空字符串的情况,但是这个类好像被舍弃了,不管怎么样,代码也附加在这里吧

    class Solution {
        public String mostCommonWord(String paragraph, String[] banned) {
            StringTokenizer paraTokenizer = new StringTokenizer(paragraph," !?',;.");
            Map<String, Integer> map = new HashMap<>();
            String ans = "";
            while (paraTokenizer.hasMoreTokens()){
                String temp = (String) paraTokenizer.nextElement();
                temp = temp.toLowerCase();
                if(map.containsKey(temp)){
                    map.replace(temp, map.get(temp)+1);
                } else{
                    int flag = 0;
                    for(int j=0; j<banned.length; j++){
                        if(temp.equals(banned[j])){
                            flag = 1;
                            break;
                        }
                    }
                    if(flag == 0){
                        map.put(temp, 1);
                    }
                }
            }
            int max = Integer.MIN_VALUE;
            for(Map.Entry<String, Integer> entry: map.entrySet()){
                if(entry.getValue() > max){
                    max = entry.getValue();
                    ans = entry.getKey();
    
                }
            }
            return ans;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
  • 相关阅读:
    (生物信息学)R语言绘图初-中-高级——3-10分文章必备——Venn图(韦恩图)(初级)
    前缀和题型总结 II :leetcode 1402、1310、1371、1171
    ElasticSearch - 映射(mapping)
    YOLOv5涨点优化:backbone改进 | TransXNet:聚合全局和局部信息的全新CNN-Transformer视觉主干| CVPR2024
    小程序 navigateBack 携带参数返回的三种方式(详细)
    C语言 指针进阶
    一个接口有多个实现类时,调用接口时,如何判定调用的哪个实现类?
    idea高级调试技巧
    抖音自动引流软件的运行分享,与开发需要到的技术分析
    Boost之Log: (2)、代码练习
  • 原文地址:https://blog.csdn.net/liuwanqing233333/article/details/126467741