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

以下是代码和运行效果:

实现方法:

 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. Hadoop权威指南:HDFS-Hadoop存档

    Hadoop权威指南:HDFS-Hadoop存档 [TOC] 每个文件按块方式存储, 每个块的元数据存储在namenode的内存中 Hadoop存档文件或HAR文件是一个更高效的文件存档工具,它将文件 ...

  2. Mysql数据库连接查询

                                    Mysql数据库连接查询 连接是关系数据库模型的主要特点.连接查询是关系数据库中最主要的查询,主要包括内连接.外连接等.通过连接运算可以 ...

  3. linux c语言定时器

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

  4. std::list 源代码解析

    首先声明,下面的讲解都是针对GCC2.9,std::alloc 通过下面的源代码大家可以看到list类的内部成员是一个node,而他的类型是linktype,前面的typedef里面有介绍是一个指针, ...

  5. java 继承的学习(转)

    转自:http://www.cnblogs.com/happyframework/p/3332243.html,非常感谢啊 public class test { /** * @param args ...

  6. iOS UISearchController 的使用方法

    iOS UISearchController 的使用方法 UISearchController 让用户在 UISearchBar 上输入搜索关键词,展示搜索结果或者进行其他操作.UISearchCon ...

  7. 覆写hashCode equal方法

    1.为什么要重写hashCode方法? 当自己要新建一个class,并要把这个类放到HashMap的时候,需要覆写这两个办法.如果不覆写,放入两个新的对象,可能会是不相等的. 在java的集合中,判断 ...

  8. kali linux live(persistence)+PE+windows7安装多启动菜单优盘制作

    需要以下工具: 下载链接: 一.制作kali linux persistence 将32GU盘格式化为FAT32格式,使用win32diskimager将kalilinux镜像写入优盘,占用优盘3.4 ...

  9. MASMPlus编译出错:error LNK2001: unresolved external symbol _WinMainCRTStartup

    初学汇编,感觉很多不懂.不过那也是,如果懂了的话就不用学了,从无到有学习一门编程语言果然不是那么容易的一件事. 学习汇编总得要有一款汇编软件才行,没理由只是使用Windows自带的DEBUG.于是上了 ...

  10. BZOJ 4089:[Sdoi2015]graft(SDOI 2015 Round 2 Day 2)

    别人家的神选系列,我只会做这道题QAQ 题目描述: 给定一颗树,加上k条边,将n个点染色,相邻两点不同,记颜色为i的又ti个,求$$\frac{\sum_{i=1}^{n} \frac{ti}{i}} ...