文章目录
需求:收集一张英语试卷里的所有单词,返回包含所有单词的List集合
比如这是张英语六级考试卷子:
现需要将里面的每个单词都保存到一个List集合中。
思路
1.将试卷(格式良好)整体作为字符串读入
2.split方法拆分原字符串
3.正则表达式过滤杂质
代码
1.工具类
/**
*
* @author pigcc
* <p>Title: fileToString</p>
* <p>Description: 读出文本文件内的字符串</p>
* @date 2019年10月22日
* @param fileName 文件全路径
* @return 文本字符串
*/
public static String fileToString(String fileName){
StringBuilder sb=new StringBuilder();
try (BufferedReader br=new BufferedReader(new FileReader(fileName))){
String info;
while((info=br.readLine())!=null) {
sb.append(info+" ");
}
} catch (Exception e) {
e.printStackTrace();
}
return sb.toString();
2.核心代码
/**
*
* @author pigcc
* <p>Title: fileToWords</p>
* <p>Description: 将给定路径下的试卷里的所有单词作为List返回,已经除去杂质,变大写为小写</p>
* @date 2019年10月16日
* @param filePath 文件全路径
* @return 单词列表
*/
public static List<String> fileToWords(String filePath) {
String s=fileToString(filePath);
String regex="[\\W]";//匹配空格,标点符号等特殊字符,用于split分割
String highAlpha = "[A-HJ-Z\\d]+";//匹配大写字母(除了I)与数字,(用于除去A,B,C,D...1,2,3,...)题号与选项号
String alph="[a-zA-Z]+";//匹配英文字母,用于除去中文
//分割后的原始列表
List<String> rawWords = Arrays.asList(s.split(regex));
//列表除杂,fliter规则:单词长度大于零,非中文,非数字,非全大写字母;
//map规则:大写->小写
List<String> validWords = rawWords.stream().filter(
(str)->str.length()>0&&Pattern.matches(alph, str)&&!Pattern.matches(highAlpha, str)
).map(high->high.toLowerCase())
.collect(Collectors.toList());
return validWords;
}
3.测试
public static void main(String[] args) {
List<String> words=fileToWords("D:\\desktop\\AAApapers\\6\\2017\\6\\1.txt");
System.out.println(words);
System.out.println(words.size());
}
4.结果
我们可以看到,一张英语六级真题,有四千个词左右!乍一看六级好难!
5.使用set集合去重
除杂部分代码改为:
Set<String> validWords = rawWords.stream().filter(
(str)->str.length()>0&&Pattern.matches(alph, str)&&!Pattern.matches(highAlpha, str)
).map(high->high.toLowerCase())
.collect(Collectors.toSet());
6.再测试
public static void main(String[] args) {
Set<String> words=fileToWords("D:\\desktop\\AAApapers\\6\\2017\\6\\1.txt");
System.out.println(words);
System.out.println(words.size());
}
7.再看结果
我们可以看到,一张英语六级真题,只考大概一千二百个不同的单词!乍一看好像又容易了!
测试试卷: 真题链接
附个人完整练手项目:www.lword.top