这个程序试图将文本文件分割成单词,并计算每个单词被使用的次数。扫描器似乎只读取了每行的部分内容,我不知道为什么。这是我第一次使用这种扫描方法。
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
public class WordStats {
public static void main(String args[]){
ArrayList<String> words = new ArrayList<>(1);
ArrayList<Integer> num = new ArrayList<>(1);
Scanner sc2 = null;
try {
sc2 = new Scanner(new File("source.txt"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
while (sc2.hasNextLine()) {
Scanner s2 = new Scanner(sc2.nextLine());
boolean set=false;
while (s2.hasNext()) {
num.add(1);
String s = s2.next().replaceAll("[^A-Za-z ]", " ").toLowerCase().trim();
for(int i=0;i<words.size(); i++){
if(s.equals(words.get(i))){
num.set(i,num.get(i)+1);
set=true;
}
}
if(!set){
words.add(s);
num.add(1);
}
}
}
for(int i=0;i<words.size();i++){
System.out.println(words.get(i)+" "+num.get(i));
}
}
}
这个文本文件是《葛底斯堡演说》:
亚伯拉罕·林肯,“葛底斯堡演说”(1863年11月19日)
八十七年前,我们的祖先在这个大陆上创立了一个新国家,在自由中孕育,在保证所有人平等的前提下奉献。
现在我们正在进行一场伟大的内战,考验着那个国家,或者任何一个以这样的方式构建和奉献的国家是否能够长久存在。我们在这场战争的伟大战场上相遇了。我们来到这里,为了纪念那些为了使这个国家生存而献出生命的人们,在这片领土上献上他们的最后安息之地。我们应该这样做,这是完全适当和正确的。
但是,从更广泛的意义上讲,我们不能奉献-我们要奉圣-我们不能将这片土地变得神圣。在这里挣扎着的勇敢的人们,无论是活着的还是死去的,都使它成为了神圣的,远远超过了我们微薄的能力来增加或者减少。世界会很少注意,也不会长久记住我们在这里说了什么,但它永远不会忘记他们在这里做了什么。对于我们活着的人来说,更重要的是,在这里致力于还未完成的工作,即为那些在这里战斗所取得的辉煌进展增加奉献。对于我们而言,更应该在这里致力于剩余的伟大任务-从这些受到崇敬的死者身上,使我们更加献身于他们献出最后一份献身精神的事业-我们在这里誓言这些死者不会白白牺牲,这个国家,在上帝的帮助下,必将获得新的自由诞生-而那个以人民为本、由人民组成、为人民服务的政府不会从地球上消失。
原始的行分隔符被保留。 我的输出似乎只计算每行的一部分,并且将空格视为两个单词。 输出:
abraham 1
lincoln 1
gettysburg 1
address 1
2
november 1
fourscore 1
and 5
seven 1
years 1
ago 1
our 2
fathers 1
brought 1
forth 1
on 2
this 3
continent 1
a 7
new 2
nation 5
conceived 2
in 4
liberty 1
now 1
we 8
are 2
engaged 1
but 2
它可能不是扫描方法,但我更熟悉代码的那一部分,我认为那不是问题所在。