编辑: 感谢dawww,问题在于编码,我将其更改为UFT-8,现在该程序运行良好。只是有点慢。
我迫切需要帮助。
问题:
我有一个TreeSet,其中包含我从文本中取出的单词,它们都是小写并且遵循此正则表达式(“[^ a-zA-Z]”),我需要的是逐字逐句地比较TreeSet带有我从中获取的文本并获取每个单词出现的行号,将它们存储到ArrayList中并返回。
我有以下代码:
public ArrayList<Integer> search(String word, String book) throws FileNotFoundException, IOException{
FileReader path = new FileReader(book);
LineNumberReader read = new LineNumberReader(path);
ArrayList<Integer> lines = new ArrayList<>();
String line;
for(line = read.readLine(); line != null; line = read.readLine()){
if(line.toLowerCase().contains(word)){
lines.add(read.getLineNumber());
}
}
return lines;
}
我们的想法是将搜索方法的返回值作为一个值用于Map&gt; (每个单词和行)
像这样:for(String s : words){
map.put(s, search(s , book));
}
单词是TreeSet,其中包含我从文本中获取的字符串(来自Lewis Carroll的爱丽丝梦游仙境)。
代码不起作用,我不知道为什么。代码编译并运行,但地图为空。
答案 0 :(得分:1)
要检查line
是否包含word
不区分大小写,可以使用Apache Commons Lang库,特别是this方法:StringUtils.containsIgnoreCase(CharSequence str, CharSequence searchStr)
。
此库还有其他可以提供帮助的实用程序方法,例如strip
和trim
在使用它们之前清理字符串非常有用。
另一个问题可能是文件的编码。 FileReader
始终使用平台默认编码。尝试使用new InputStreamReader(new FileInputStream(filePath), <encoding>)
从文件中读取。
答案 1 :(得分:0)
请记住contains
方法具有案例敏感性。
你正在对小写line.toLowerCase()
因此可能不匹配。
请为line.toLowerCase()输入System.out.print语句并将word检查
System.out.print(line.toLowerCase()+" "+word);
如果是这种情况,那么解决方案是在if条件下也将该单词小写。
if(line.toLowerCase().contains(word.toLowerCase())){
lines.add(read.getLineNumber());
}