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

以下是代码和运行效果:

实现方法:

 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. Wireshark网络抓包(四)——工具

    一.基本信息统计工具 1)捕获文件属性(Summary) 1. File:了解抓包文件的各种属性,例如抓包文件的名称.路径.文件所含数据包的规模等信息 2. Time:获悉抓包的开始.结束和持续时间 ...

  2. 基于C++11的线程池,简洁且可以带任意多的参数

    咳咳.C++11 加入了线程库,从此告别了标准库不支持并发的历史.然而 c++ 对于多线程的支持还是比较低级,稍微高级一点的用法都需要自己去实现,譬如线程池.信号量等.线程池(thread pool) ...

  3. React-intl 实现多语言

    前言 React 做国际化,我推荐使用 React-intl , 这个库提供了 React 组件和Api两种方式来格式化日期,数字和字符串等.知道这个库了,那让我们开始使用它 组件用法 为了和Reac ...

  4. 1.使用SignalR实现页面即时刷新(服务端主动推送)

    模块功能说明: 实现技术:sqlserver,MVC,WebAPI,ADO.NET,SignalR(服务器主动推送) 特殊车辆管理--->移动客户端采集数据存入数据库---->只要数据库数 ...

  5. 基于DDD的.NET开发框架ABP实例,多租户 (Sass)应用程序,采用.NET MVC, Angularjs, EntityFramework-介绍

    介绍 基于ABPZERO的多租户 (Sass)应用程序,采用ASP.NET MVC, Angularjs-介绍 ASP.NET Boilerplate作为应用程序框架. ASP.NET MVC和ASP ...

  6. Spring Mvc中使用Task实现定时任务,以及遇到的一个问题

    Spring中实现定时任务其实很简单,可以使用spring中自带的task 相当于轻量级的Quartz,并且spring 3.0 之后支持注解的方式,使用起来非常简单,方便,具体实现如下: 第一步,修 ...

  7. php批量删除,批量操作

    批量删除多条记录,对于比较多的信息,如果没有批量删除功能是非常麻烦的. 1.从数据库中拿一张表过来,写个复选框进行选择   可以加全选复选框 连接数据库什么的都不写啦 代码: <form act ...

  8. Mysql动态sql语句,用当前时间做表名

    在mysql备份操作中, 我们可能要使用表名和当前时间来做为备份表的名称,但是MySQL在存储过程中不支持使用变量名来做表名或者列名. 例如:有一个表"user",我需要备份一份, ...

  9. B/S架构与C/S架构的区别

    C/S结构,即Client/Server(客户机/服务器)结构,是大家熟知的软件系统体系结构,通过将任务合理分配到Client端和Server端,降低了系统的通讯开销,可以充分利用两端硬件环境的优势. ...

  10. 《经久不衰的Spring框架:Spring+SpringMVC+MyBatis 整合》

    前言 主角即Spring.SpringMVC.MyBatis,即所谓的SSM框架,大家应该也都有所了解,概念性的东西就不写了,有万能的百度.之前没有记录SSM整合的过程,这次刚刚好基于自己的一个小项目 ...