Java字符串分割

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

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

解决

  1. 通过 | 隔开各分隔符
String[] strArray = paragraph.split("!|\\?|'|,|;|\\.| ");
  1. 使用[ ]包裹各分割符
String[] strArray = paragraph.split("[!\\?',;\\. ]");
遇到的问题2: 转义字符有哪些,如何处理

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

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

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

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

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

strArray[0].length() == 0

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

遇到的问题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;
        }

}

附加: 本人也采用了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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值