Java String.split,带“";[^a-zA-Z0-9]&x2B&引用;仍将空格显示为单词
我遇到了一个程序的问题,该程序在Java中为给定文档创建单词到频率的映射。当我把所有的单词都打印出来时,我仍然认为“”是一个“单词” 以下是解释代码:Java String.split,带“";[^a-zA-Z0-9]&x2B&引用;仍将空格显示为单词,java,regex,string,inverted-index,Java,Regex,String,Inverted Index,我遇到了一个程序的问题,该程序在Java中为给定文档创建单词到频率的映射。当我把所有的单词都打印出来时,我仍然认为“”是一个“单词” 以下是解释代码: String delimiters = "[^a-zA-Z0-9]+"; String[] words; SortedSet<String> allWords = new TreeSet<String>(); Map<String, Map<String, Integer>> wordMap = n
String delimiters = "[^a-zA-Z0-9]+";
String[] words;
SortedSet<String> allWords = new TreeSet<String>();
Map<String, Map<String, Integer>> wordMap = new HashMap<String, Map<String, Integer>>();
while ((line = bufferedReader.readLine()) != null) {
words = line.split(delimiters);
for all words add the word to the allWords set and the wordMap
}
for (String word : allWords) {
System.out.println(word + " : " + wordMap.get(word).entrySet());
}
这个空白怎么显示出来的?
谢谢
ps如果您想看到完整的代码,这里是,它不是一个空格,而是一个空字符串。 当文件中有空行时会发生这种情况 做这样的事
words = "".split(delimiters);
结果是一个数组有一个元素,该元素是空字符串。不是空白的是空字符串。 当文件中有空行时会发生这种情况 做这样的事
words = "".split(delimiters);
结果数组中有一个元素,而该元素是空字符串。@SotiriosDelimanolis除小写和大写字母和数字外的所有内容意思不是,不是空格,是空字符串。在(int k=0;k
之后,{
只要把放在(words[k].length==0)继续;
每个认为索蒂里奥斯的评论有用的人都缺乏对正则表达式的理解。@SeanBright我想他们误读了这个问题,并假设它是在问为什么[^a-zA-Z0-9]+
匹配的是空白。但不管怎样,这都不是一个有用的注释,因为使用^
实际上不是问题。@SotiriosDelimanolis除了小写和大写字母和数字之外的所有内容都是不匹配的。这不是空格,而是空字符串。for之后(int k=0;k
如果(单词[k].length==0)继续,就把放进去;
每个认为索蒂里奥斯的评论有用的人都缺乏对正则表达式的理解。@SeanBright我想他们误读了这个问题,并认为它是在问为什么[^a-zA-Z0-9]+
匹配的是空格。但不管怎样,这都不是一个有用的注释,因为使用^
实际上不是问题所在。所以我应该先检查line==“”是否?不,在使用words
中的每个单词之前,您应该检查它是否为空。String.split()
将返回一个数组,该数组可以将空字符串作为一个或多个元素(如果一行中有两个字符与分隔符相匹配),您可以这样做,或者,在处理完所有行后,只需从映射中删除空字符串键。仅为空格(或仅为“-delimeters”)的行也将具有“”
空字符串匹配。只需在循环中添加一个对“”的检查将更有效,您将其描述为“对于所有单词,将单词添加到所有单词集和单词映射”。此外,您不应该执行\word.length()==0
或”。等于(word)
,而不是==word
@SeanBright-他不会得到在分隔符之间,因为拆分匹配正则表达式末尾的“+”。因此,我应该首先检查line==”?否,在对单词进行任何操作之前,您应该检查单词中的每个单词是否为空。字符串。split()
将返回一个数组,该数组可以将空字符串作为一个或多个元素(如果一行中有两个字符与您的分隔符相匹配
),您可以这样做,或者,在处理完所有行后,只需从映射中删除空字符串键。仅为空格(或仅为“-delimeters”)的行也将有一个”
空字符串匹配。只需添加对“”的检查将更有效在您描述为“for all words”的循环中,将单词添加到allWords集合和wordMap。此外,您不应该执行\word.length()==0
或”。equals(word)
,而不是”==word
@SeanBright-由于拆分匹配正则表达式末尾的“+”,他将不会在分隔符之间获得“”。