以下是我所使用的代码:
while ((lineContents = tempFileReader.readLine()) != null)
{
String lineByLine = lineContents.replaceAll("/\\.", System.getProperty("line.separator")); //for matching /. and replacing it by new line
changer.write(lineByLine);
Pattern pattern = Pattern.compile("\\r?\\n"); //Find new line
Matcher matcher = pattern.matcher(lineByLine);
while(matcher.find())
{
Pattern tagFinder = Pattern.compile("word"); //Finding the word required
Matcher tagMatcher = tagFinder.matcher(lineByLine);
while(tagMatcher.find())
{
score++;
}
scoreTracker.add(score);
score = 0;
}
}
我的示例输入包含6行,word
的出现为[0,1,0,3,0,0]
所以当我打印scoreTracker
(这是ArrayList
)时,我想要上面的输出。
但相反,我得[4,4,4,4,4,4]
,它word
的总出现次数,但不是逐行的。{{1}}。
请帮助。
答案 0 :(得分:3)
lineByLine
指向文件的全部内容。这就是你获得[4,4,4,4,4,4]
的原因。您需要将每一行存储在另一个变量line
中,然后使用tagFinder.find(line)
。
最终代码将如下所示
while ((lineContents = tempFileReader.readLine()) != null)
{
String lineByLine = lineContents.replaceAll("/\\.", System.getProperty("line.separator")); //for matching /. and replacing it by new line
changer.write(lineByLine);
Pattern pattern = Pattern.compile(".*\\r?\\n"); //Find new line
Matcher matcher = pattern.matcher(lineByLine);
while(matcher.find())
{
Pattern tagFinder = Pattern.compile("word"); //Finding the word required
//matcher.group() returns the input subsequence matched by the previous match.
Matcher tagMatcher = tagFinder.matcher(matcher.group());
while(tagMatcher.find())
{
score++;
}
scoreTracker.add(score);
score = 0;
}
}
答案 1 :(得分:1)
也许这段代码可以帮到你:
String str = "word word\n \n word word\n \n word\n";
Pattern pattern = Pattern.compile("(.*)\\r?\\n"); //Find new line
Matcher matcher = pattern.matcher(str);
while(matcher.find())
{
Pattern tagFinder = Pattern.compile("word"); //Finding the word required
Matcher tagMatcher = tagFinder.matcher(matcher.group());
int score = 0;
while(tagMatcher.find())
{
score++;
}
System.out.print(score + " ");
}
输出为2 0 2 0 1
它没有高度优化,但问题是你从不限制内部匹配,它总是扫描整行。
答案 2 :(得分:1)
这是因为每次搜索相同的字符串(lineByLine)。您可能想要的是分别搜索每一行。我建议你这样做:
Pattern tagFinder = Pattern.compile("word"); //Finding the word required
for(String line : lineByLine.split("\\n")
{
Matcher tagMatcher = tagFinder.matcher(line);
while(tagMatcher.find())
score++;
scoreTracker.add(score);
score = 0;
}
答案 3 :(得分:1)
原始代码使用tempFileReader.readLine()
一次读取一行输入,然后使用matcher
查找每行中的行尾。由于lineContents
只包含一行,matcher
永远不会找到新行,因此会跳过其余代码。
为什么需要两个不同的代码来将输入分成行?
您可以删除与查找新行相关的一些代码。 E.g。
while ((lineContents = tempFileReader.readLine()) != null)
{
Pattern tagFinder = Pattern.compile("word"); //Finding the word required
Matcher tagMatcher = tagFinder.matcher(lineContents);
while(tagMatcher.find())
{
score++;
}
scoreTracker.add(score);
score = 0;
}
我在Windows上使用BufferedReader
读取的文件test.txt尝试了上面的代码。 E.g。
BufferedReader tempFileReader = new BufferedReader(new FileReader("c:\\test\\test.txt"));
scoreTracker包含[0,1,0,3,0,0]的文件,其中包含您描述的内容。
如果示例输入是所描述的实际文件且tempFileReader
是BufferedReader
,我不明白你是如何从原始代码中获得[4,4,4,4,4,4]的。查看用于设置tempFileReader
。
答案 4 :(得分:0)
您可以使用Scanner类。您将扫描仪初始化为您想要计算的字符串,然后计算扫描仪找到的这些令牌的数量。
您可以使用FileInputStream直接初始化Scanner。
结果代码只有9行:
File file = new File(fileName);
Scanner scanner = new Scanner(file);
scanner.useDelimiter("your text here");
int occurences;
while(scanner.hasNext()){
scanner.next();
occurences++;
}
scanner.close();