在上个星期阿里巴巴一面的时候,最后面试官问我如何把一篇文章中重复出现的词或者句子找出来,当时太紧张,答的不是很好。今天有时间再来亲手实现一遍。其实说白了也就是字符串的处理,所以难度并不是很大。

以下是代码和运行效果:

实现方法:

 import java.io.*;
import java.util.*; /**
* Created by chunmiao on 17-3-20.
*/
public class ReadArticle {
//读取文件名称
private String filename;
//读取段落
private ArrayList<String> result = new ArrayList<>();
//最小字长(两个字以上进行匹配)
private final int MINSIZE = 2;
//重复词储存
HashSet<String> set; public ReadArticle(String filename, HashSet<String> set) {
this.filename = filename;
this.set = set;
} public void createData() throws IOException {
String r;
//读取文章内容
BufferedReader in = new BufferedReader(new FileReader(new File(filename).getAbsoluteFile()));
try {
while ((r = in.readLine()) != null) {
//消除不必要的标点符号
r = r.replaceAll("\\s+ |“|\\[|‘|《| *|", "").trim();
//留下” , 。 。” ”。 ”, ? 》 -等作为划分句子的分割符标示
Collections.addAll(result, r.split(",|(。”|”(。|,)|。)|(\\])|”|’|?|:|》|-"));
}
}finally {
in.close();
} //对文章内容进行遍历找出重读出现的句子或者是词语
for (int i = 0 ; i < result.size() - 1; i ++){
for (int j = 0 ; j < result.size() - i - 1; j ++) {
//将重复出现的词语保存到set集合里面
set.addAll(getSameCharacter(result.get(i), result.get(j + i + 1)));
}
} } private ArrayList<String> getSameCharacter(String a1, String a2){
String maxS;
String minS;
//短句遍历开始处
int start = 0;
//词的长度最短为两个字长
int range =2;
//设定短句和长句s,使得遍历更加快捷
if (a1.length() <= a2.length()){
maxS = a2;
minS = a1;
}else {
maxS = a1;
minS = a2;
}
String result = "";
ArrayList<String> list = new ArrayList<String>();
//防止substring时超出范围
while (start + range <= minS.length()) {
//如果句子或词在对象里面,则找出相应的句子或词保存在list里面
if (maxS.indexOf(minS.substring(start, start + range)) != -1) {
//获取最长句子,删除短句子
list.remove(result);
list.add(minS.substring(start, start + range));
result = minS.substring(start, start + range);
range++;
continue;
}
range = MINSIZE;
start++;
}
return list;
}
}

测试代码:

 import java.io.IOException;
import java.util.HashSet; public class Main { public static void main(String[] args) throws IOException {
String filename = "test.txt";
HashSet<String> result = new HashSet<String>();
ReadArticle read = new ReadArticle(filename,result);
read.createData();
System.out.println("这篇文章中的重复出现的词或句子有以下几个词或句子:\n");
for (String s : result){
System.out.println(s);
}
}
}

读取的文章内容:

正则匹配结果(去掉多余字符):

字符串转换成ArrayList: 

最终处理结果:

其实从上面的结果可以看出。单纯的操控字符串并不能判断它是否是一个完整的词和句,应该还要配合数据库字典来匹配上面的结果,从而找出真正的词和句。

Java实现读取文章中重复出现的中文字符串的更多相关文章

  1. JAVA实验--统计文章中单词的个数并排序

    分析: 1)要统计单词的个数,就自己的对文章中单词出现的判断的理解来说是:当出现一个非字母的字符的时候,对前面的一部分字符串归结为单词 2)对于最后要判断字母出现的个数这个问题,我认为应该是要用到ma ...

  2. Java去除ArrayList集合中重复字符串的案例

    ArrayList去除集合中的字符串重复值 分析: A:创建集合对象 B:添加多个字符串元素 C:创建新集合 D:遍历旧集合,获取得到每一个元素 E:拿着个元素到新集合去找,看有没有 有:不进去 没有 ...

  3. JAVA导入(读取)Excel中的数据(支持xls与xlsx文件)

    一.导入jar包 poi-3.7.jarpoi-scratchpad-3.7.jarpoi-examples-3.7.jarpoi-ooxml-3.7.jarpoi-ooxml-schemas-3.7 ...

  4. java后台读取配置文件中key与value -----demo2

    /** * * @Title: getValue * @Description: TODO * @param key * @return import java.util.Properties; * ...

  5. java后台读取配置文件中key与value -----demo

    public class ResourcesUtils { /* * @description:根据属性获取文件名 * * @param:propertyName文件的属性名 * * @return: ...

  6. 通过java api 读取sql 中数据(查询)

    配置文件:dbconfig.properties 里面的数据 jdbc.url.jwhat=jdbc\:mysql\://ip\:3306/laibadev?useUnicode\=true& ...

  7. java jxl读取excel中Date类型

    Workbook book = Workbook.getWorkbook(excel); Sheet sheet = book.getSheet(0); int clos = sheet.getCol ...

  8. java中用正則表達式推断中文字符串中是否含有英文或者数字

    public static boolean includingNUM(String str)throws  Exception{ Pattern p  = Pattern.compile(" ...

  9. [Java] 在 jar 文件中读取 resources 目录下的文件

    注意两点: 1. 将资源目录添加到 build path,确保该目录下的文件被拷贝到 jar 文件中. 2. jar 内部的东西,可以当作 stream 来读取,但不应该当作 file 来读取. 例子 ...

随机推荐

  1. Plugin execution not covered by lifecycle configuration的解决方案

    pom配置文件中,提示错误:Plugin execution not covered by lifecycle configuration. 如图: 这表示m2e在其执行maven的生命周期管理时没有 ...

  2. jq-实战之表格筛选

    css部分 .select{background: #ccc} html部分 table width="> <thead> <th>姓名</th> ...

  3. maven常用命令介绍(持续更新)

    一.Maven的基本概念 主要服务于基于Java平台的项目构建,依赖管理和项目信息管理. 1.1.项目构建 项目构建过程包括[清理项目]→[编译项目]→[测试项目]→[生成测试报告]→[打包项目]→[ ...

  4. linux c语言定时器

    原文来自于:http://hi.baidu.com/opetrhsxszbckzd/item/126966cae5f9524aa9ba94f5 我只是把其重新排版标注一下. linux c语言定时器 ...

  5. db2_errroecode

    sqlcode sqlstate  说明 000 00000 SQL语句成功完成   01xxx SQL语句成功完成,但是有警告 +012 01545 未限定的列名被解释为一个有相互关系的引用 +09 ...

  6. 《解决在Word中为汉子插入拼音及音标的问题》

    说明:本人使用的是Word2007版本.以下示例都是基于本人电脑操作.如有疑问,欢迎留言交流. [1]为word中的一些文字添加拼音及音标. [2]开始为文字添加拼音及音标. 选中要添加拼音及音标的文 ...

  7. java批量爬去电影资源

    摘要 网上有很多个人站来分享电影资源,其实有时候我们自己也想做这个一个电影站来分享资源.但是这个时候就有一个问题,电影的资源应该从哪里来呢?难道要自己一条条手动去从网络上获取,这样无疑是缓慢而又效率低 ...

  8. Windows 10 IoT Serials 6 - 如何修改IoTStartupOnBoot.cmd文件

    使用Windows 10 IoT Core系统的朋友应该会比较熟悉IoTStartupOnBoot.cmd文件,该文件是系统启动以后加载的批处理文件,一般会包含应用.服务和后台的启动,比如WinRM. ...

  9. 《剑指offer》— JavaScript(1)二维数组中的查找

    二维数组中的查找 题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ** ...

  10. 漂亮的代码3:flatten 一个数组

    看到一个题目: flatten([1,2,3]) // => [1,2,3] flatten([[1,2,3],["a","b","c" ...