相关知识点:使用Scanner类和正则表达式来解析文件,以时间换空间。
(1)创建文件:
File file = new File("路径");
(2)创建Scanner的输入源:
Scanner sc = new Scanner(file);
(3)Scanner对象设置分隔标记:
sc.useDelimiter(pattern);
实验目的:掌握使用Scanner类解析文件。
实验要求:
(1)一共出现了多少个单词;
(2)一个有多少个不同的单词;
(3)按单词出现的频率大小顺序排列输出单词。
代码和注释都放在下面:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.*;
public class WordStatistic{
Vector<String> allWord,noSameWord;//Vector暂时可以理解为和ArrayList差不多
File file = new File("D:\\Download\\a1.txt");//指定文件路径
Scanner sc = null;
String regex;
WordStatistic(){
allWord = new Vector<String>();
noSameWord = new Vector<String>();
regex = "[//s//d//p{Punct}]+";//正则表达式
try {
sc = new Scanner(file);//将文件作为输入源
sc.useDelimiter(regex);//将regex作为分隔符
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public void setFileNAme(String name){
file = new File(name);
try {
sc = new Scanner(file);
sc.useDelimiter(regex);
} catch (Exception e) {
e.printStackTrace();
}
}
public void wordStatistic(){
try {
while(sc.hasNext()){//只要sc还有下一个单词,就继续往下读
String word = sc.next();
allWord.add(word);//将读到的单词加进allWord中
if(!noSameWord.contains(word)){//将不同的单词加入到noSameWord中
noSameWord.add(word);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public Vector<String> getAllWord(){
return allWord;
}
public Vector<String> getNoSameWord(){
return noSameWord;
}
}
import java.util.Vector;
public class OutputWordMess {
public static void main(String[] args) {
Vector<String> allWord,noSameWord;
WordStatistic statistic = new WordStatistic();
statistic.setFileNAme("D:\\Download\\a1.txt");
statistic.wordStatistic();
allWord = statistic.getAllWord();
noSameWord = statistic.getNoSameWord();
System.out.println("共有" + allWord.size() + "个英文单词");
System.out.println("有" + noSameWord.size() + "个互相不同的英文单词");
System.out.println("按出现的频率排列:");
int count[] = new int[noSameWord.size()];
for (int i = 0; i < noSameWord.size(); i++) {
String s1 = noSameWord.elementAt(i);//当前出现的单词
for (int i1 = 0; i1 < allWord.size(); i1++) {
String s2 = allWord.elementAt(i1);
if(s1.equals(s2)){//与所有出现的单词进行比较,如果相同就+1,即增加其频率
count[i]++;
}
}
}
for(int m = 0;m < noSameWord.size();m++){
for(int n = m + 1;n < noSameWord.size();n++){
if(count[n] > count[m]){
String temp = noSameWord.elementAt(m);//暂时存放当前出现频率最高的单词
//下面代码:将出现频率高的单词与出现频率低的单词互换位置,到最后,noSameWord中就是按照出现频率高低来存放单词的
noSameWord.setElementAt(noSameWord.elementAt(n),m);
noSameWord.setElementAt(temp,n);
int t = count[m];
count[n] = t;
}
}
}
//按照出现频率输出单词
for(int m = 0;m < noSameWord.size();m++){
double frequency = (1.0 * count[m]) / allWord.size();
System.out.printf("%s:% - 7.3f",noSameWord.elementAt(m),frequency);
}
}
}