故事的起因源于这样一道题
我的思路: 分割字符串得到由各单词组成的数组, 用map统计各单词出现的次数,再排除在禁用列表中的单词
遇到的问题 1:使用split分割字符串时,如何设置多个分割符
解决:
- 通过 | 隔开各分隔符
String[] strArray = paragraph.split("!|\\?|'|,|;|\\.| ");
- 使用[ ]包裹各分割符
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;
}
}