写一个Java程序能够找出这两个文本中相同的单词,求帮忙看看哪里错了?
 package union.practice;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;

/**
 * 有两个文本文件,每一行是一个单词,写一个Java程序能够找出这两个文本中相同的单词。
 * 1.需要考虑所有有可能出现的异常,需要有较好的用户体验,出现异常应该有友好的提示信息而不是java中的Exception;
 * 2.程序尽量简洁高效,要求两个文本中各有10万单词量时,找出相同单词的时间不超过0.5秒; 3.对写的程序要有完整的单元测试代码。
 */
public class App {

    // commonStringSet存储最后结果
    public static volatile Set<String> commonStringSet = new HashSet<String>();
    public static volatile Set<String> setA = new HashSet<String>();
    public static volatile Set<String> setB = new HashSet<String>();


    /**
     * 找出两个文本文件中相同的单词
     * 
     * @param file1
     *            文件1文件名
     * @param file2
     *            文件2文件名
     * @param destination
     *            相同文本存储的位置
     */
    public Set<String> findCommonWordsInTwoFiles(String fileA, String fileB) {
        //开启两个线程,分别读取两个文件的内容存储到他们对应的HashSet,同时比较当前读取到的内容是否存在于另一线程对应的集合中,如果在,添加到公共集合
        final String tempFileA = fileA;
        final String tempFileB = fileB;

        Thread tA = new Thread(new Runnable() {
            public void run() {
                File fA = new File(tempFileA);

                try {
                    BufferedReader bfA = new BufferedReader(new FileReader(fA));

                    // 读取文件1中的内容存储于set1中
                    String temp = null;
                    while ((temp = bfA.readLine()) != null) {
                        synchronized (setA) {
                            setA.add(temp);
                        }
                        if(setB.contains(temp))
                            synchronized (commonStringSet) {
                                commonStringSet.add(temp);
                        }
                    }

                    bfA.close();
                } catch (FileNotFoundException e) {
                    System.out.println("待查找的文件不存在");
                } catch (IOException e) {
                    System.out.println("系统读取文件异常");
                }
            }
        });
        tA.start();

        Thread tB = new Thread(new Runnable() {
            public void run() {
                File fB = new File(tempFileB);

                try {
                    BufferedReader bfB = new BufferedReader(new FileReader(fB));

                    // 读取文件1中的内容存储于set1中
                    String temp = null;
                    while ((temp = bfB.readLine()) != null) {
                        synchronized (setB) {
                            setB.add(temp);
                        }
                        if(setA.contains(temp))
                            synchronized (commonStringSet) {
                                commonStringSet.add(temp);
                            }

                    }

                    bfB.close();
                } catch (FileNotFoundException e) {
                    System.out.println("待查找的文件不存在");
                } catch (IOException e) {
                    System.out.println("系统读取文件异常");
                }
            }
        });
        tB.start();

        //等待AB线程执行结束后返回
        try {
            tA.join();
            tB.join();
        } catch (InterruptedException e) {
            System.out.println("系统不能处理您的请求");
        }

        return commonStringSet;
    }

}

测试的时候拿已知的HashSet结果与函数返回的结果相比较,但是从运行结果来看,并不总是相等的,我想问题应该是出在同步的层面,求解释(测试时数据量比较大,其中一个文件有10万行,一个文件两百行)

1个回答

问题应该是Thread不同步问题,假设tA读到500行,tB读到100行,假设在100到500行以内有相同的,setA里有,但是setB里没有,这样就不会成功。
建议你两个文件一行一行的同时读。

u013096859
「已注销」 可是线程AB都总会执行完啊,tB也总会执行到500行的,那时候在比较setA与setB不就有了么
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
输入一行文本,其中包含多个单词,找出最长的单词长度
#include #include #include #include void main() { char text[1000]; int maxValue=0; int value=0; printf("请输入一行文本:\n"); gets(text); int length=strlen(text); for(int i=0;i<length+1;i++) { i
查找两段文本中相同的词句
//找出两段文本中相同的单词短句function meizz(a, b, n){    var c=a.length>b.length?b:a;    if(b==c) b=a; a=c; //少做些循环    if(!n) n=1;    var mm = new Array();    for(var i=0; i    {        for(var j=i+n; j        {  
C++实现判断两个单词是否为变位词
C++实现判断两个单词是否为变位词
Java去除文件中重复的单词
在学习专业英语的时候,喜欢使用world记录单词对应的中文翻译, 如下图: 但是发现会存在重复的单词,于是便想到使用Java中的Map集合的特性完成单词去重的任务。 主要步骤:1.使用Scanner将文件的每一行读入并保存在字符串中; 2.将字符串拆分成中文和英文两个部分; 3.中文部分作为Map集合的key,英文部分作为相应的value; 4.将Map集合的数据使用printWriter
大文本文件中找词频最高的10个词
http://www.cnblogs.com/orchid/archive/2012/04/22/2464511.html
shell实例浅谈之四查找文本中出现频率最高的单词
一、问题       判断一个文件是否是可执行文件,并且判断能否在系统PATH路径中找到。第一种情况:可执行且找到返回0,第二种情况没找到或者不可执行返回1,第三种情况可执行但没找到或没找到返回2。若有需求还可以细分。 二、解决 1、shell脚本 新建checkxfilepath.sh文件,chmod +x checkxfilepath.sh,然后执行。 ####判断一
[算法]寻找字母重复组合的单词
//有字符串如"ABCD,BDAC,DRF,FRD,CADB,CAADB,XB",要将其中由相同字符组成的词归在一起,如果没有和其由相同字符组成的词则去掉,如上的结果为://组1:ABCD,BDAC,CADB//组2: DRF,FRD//另外,CAADB和XB去掉 string vText= @"ABCD,BDAC,DRF,FRD,CADB,CAADB,XB";List
找出文件中最高频率的前k个单词
很久之前参加一个小公司实习的线下笔试,做了这个题目,感觉还蛮有意思的。想做个记录。 一、题目 Write a program for displaying the ten most frequent words in a file such that your program should be efficient in all complexity measures. 问题的关
Java——检索一段话中出现次数最多的英文单词
今日看到一个题目,要求在给出的一段话中检索出出现频率最高的单词。现在此分享。题目:在下面这段话中,检索出出现次数最多的英文单词: Look to the skies above London and you’ll see the usual suspects rainclouds, plane and pigeons. But by the end of the year, you might j
求一段字符串中出现的相同且长度最长的字符串
求一段字符串中出现的相同且长度最长的字符串 int main() { string str,substr; string str1; int t3; int t1 = 0; int t2 = 0; cout<<"请输入字符串"<<endl; int maxnum = 0; int count = 0; cin>>str; int len = str
给出两个单词,找到它们的最短距离
题目 有一个很大的文本文件,里面包含许多英文单词。给出两个单词,找到它们的最短距离 (以它们之间隔了多少个单词计数)。你能在O(1)的时间内返回任意两个单词间的最短距离吗? 你的解法空间复杂度是多少? 解答 先看一个例子,为了简单起见,我们假设文件里就只有以下两句话。然后, 我们现在来求is和name的最短距离。假设相邻的两个单词距离为1。 12What is
一个数组中只有两个数字单独出现,其余数字都是成对出现的,请找出这两个数。
排序:#include<stdio.h> #include<stdlib.h> int check(int arr[], int len) //将arr[]中的数组进行异或,然后将结果返回 { int num = 0; for (int i = 0; i < len; i++) {
set应用:提取文本中所有不同的单词
set应用:提取文本中所有不同的单词set是一个常用的容器,是数学意义上的集合–每个元素最多只能出现一次。和sort函数一样,自定义的类型(struct、class)也可以构造set,但是同样必须定义“小于”运算符。 例题: 输入一个文本,找出所有不同的单词,按照字典序从小到大输出。单词不区分大小写,大写的单词按小写输出。这里的单词定义为连续的字母序列。 样例输入:I am a student
给你一个字符串s和一个长度相同的单词列表。 找出s中所有子字符串的起始索引,这些字符串中的每个单词只是一个字符串,没有任何中介字符。
本题源自leetcode  30 -------------------------------------------------------------------------------- 思路: 用两个map做映射、。 1 先把字典中的单词做一个map映射。 2 遍历字符串。每次都截取字典中单词长度的子串,如果在字典中出现,接着向后遍历,直到在字典中的所有单词都出现。否则就从下
给定一个字符串列表,找出单词中最长单词,可以用l列表中的其他单词一次构建一个字符。返回具有最小字典顺序的最长单词。
本题源自leetcode --------------------------------------------------------------------------------------- 思路:  1 先对字符串列表的单词排序。 2 然后遍历每一个字符串,用有序表set存储。如果这个单词的前缀在set中出现过或者单词长度为1,就插入到set 3 选出最长的字串 代码:
找出一段英文中每个单词出现的次数
 package JzxPro; import java.util.HashMap; import java.util.Map; import java.util.Scanner; public class test3 { public static void main(String[] args) { System.out.print
用java程序分析一个文本文件中各个词出现的频率,并把频率最高的十个单词打印出来(一般的冠词,虚词除外)
你的
统计文本文件中单词出现频率,自己编写的Java小程序
从文本文件中读取文本,文本文件名被作为命令行参数传递,统计单词不区分大小写。 1.以字典序显示输出,每个单词后面紧跟它的出现次数 2.出现频率最高的单词的统计
Shell: 如何计算一个文本文件中有多少个相同的单词??
之前的博客中,我介绍了 wc 和 tr 的一些用法。 我们就用之前介绍的命令来完成这个任务吧。 比如我有一个文件 example.txt 如下: I am a good good good mother. Kaixing is a good boy. I love him.  good good study, day day up. 找出example.txt
编写函数计算一个英文字符串中的单词个数。
题目内容:编写函数计算一个英文字符串中的单词个数。 输入格式: 一个最长500个字母的英文字符串,不包含数字和特殊字符,但可能包含一些英文标点符号(逗号、句点、问号)。标点符号独立出现时不视为一个单词。 单词间可能包含一个或多个空格。 输出格式: 该句子的单词个数 输入样例: We hope everyone watches them with warmth. 输出样例:
TXT在线小说管理器
不知道哪里写错了,各位大神帮忙指点下,告诉怎么进行修改
查找文本中n个出现频率最高的单词
#!/bin/bash end=$1 #S1是输出频率最高单词的个数 cat $2 | #是目标文本文件的名称 tr -cs "[a-z][A-Z]" "[\n*]" | #将文本文件以一行一个单词的形式显示 tr A-Z a-z | #将单词的大写字母转为小写字母 sort | #对单词排序 uniq -c | #对排序好的单词列表统计每一个单词出现的次数 sort -k1nr -k2 |
查找指定的文本中给定的单词出现的次数
给出一段文本以及这段文本可能出现的单词,单词有可能是包含在这段文本中的一个单词中,对于重复出现的单词只计一次,例如: import re def count_words(text, words):     return len([word for word in words if re.search(word, text.lower()) != None]) if __na
求出现重现次数最多的字母,如有多个重复的则都求出来
一个字符串中可能包含a~z中的多个字符,如有重复,如String="aavlasdjflajeeeeewjjowejjojasjfesdvoeawje";,求出现次数最多的那个字母及次数,如有多个重复的则都求出。 1.引入TreeSet:通过集合快速找到所有出现的字符串 2.引入ArrayList:为了快速排序,再通过StringBuffer生成排序后的字符串 3.通过String api 中的基本方法indexOfLaseIndexOf 来计算TreeSet 中每个字符串的最大值 4.如果出现相同的,则把
java统计文本中的不同的单词和重复的单词
System.out.println(str[p]);import java.io.*; import java.util.*; import java.nio.file.*; public class Duqudata { public static void main(String[] args){ String token=""; Path path=Paths.get("D
使用java,计算一段文本中出现英语单词次数最多的单词
代码用到了递归,排序,集合类型等知识点(呵呵,花了我半天写这个,有点水),写的还有点乱,我也懒得整理了;
(Java)一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。
首先:位运算中异或的性质:两个相同数字异或=0,一个数和0异或还是它本身。 当只有一个数出现一次时,我们把数组中所有的数,依次异或运算,最后剩下的就是落单的数,因为成对儿出现的都抵消了。 依照这个思路,我们来看两个数(我们假设是AB)出现一次的数组。我们首先还是先异或,剩下的数字肯定是A、B异或的结果,这个结果的二进制中的1,表现的是A和B的不同的位。我们就取第一个1所在的位数,假设是第3位,...
【程序员面试金典】在二维平面上,有两个正方形,请找出一条直线,能够将这两个正方形对半分。假定正方形的上下两条边与x轴平行。
题目描述 在二维平面上,有两个正方形,请找出一条直线,能够将这两个正方形对半分。假定正方形的上下两条边与x轴平行。 给定两个vecotrA和B,分别为两个正方形的四个顶点。请返回一个vector,代表所求的平分直线的斜率和截距,保证斜率存在。 测试样例: [(0,0),(0,1),(1,1),(1,0)],[(1,0),(1,1),(2,0),(2,1)] 返回:[0.0,0.5] ...
编程挑战:找一个字符串中最长的单词
外国编程挑战网站: https://coderbyte.com/editor/guest:Longest%20Word:Java 上面的题,题目如下 Using the Java language, have the function LongestWord(sen) take the sen parameter being passed and return the larg
两个有序数组判断存在相同元素
/** * 判断两个有序数组是否存在相同元素 * Created by sx on 2017/12/15. */ public class hasSameElement { static boolean is_has_same_element(int[] arry1,int[] arry2) { //边界判断 if(arry1.length
【python学习笔记】4:精度控制/文件读/split()方法
今天这三道不是算法题,算是熟悉一下python中的精度控制和文件读操作。   题目描述:编写循环控制代码用下面公式逼近圆周率(精确到小数点后15位),并且和math.pi的值做比较。 *求解圆周率保留一定精度并比较 import math def JC(r): num=1 for i in range(1,r+1): num*=i retur
寻找两个已排序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。nums1 = [1, 3] nums2 = [2] 中位数是 2.0nums1 = [1, 2] nums2 = [3, 4] 中位数是 (2 + 3)/2 = 2.5class Solution { public double fi...
java实现字符串匹配问题之求两个字符串的最大公共子串
本文通过简单的事例阐述字符串对比的算法思想,并用java给予实现。该算法可以用于求两个字符串的子串、最大子串等。
java 找出文档中十个高频词 修改版
import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.HashMap; import java.util.Map; public class li1 {  static String[] a;
查找句子中最长的单词
最近开始在freeCodeCamp上学习,对JavaScript的算法部分的题目进行记录,强化一下自己的知识点,也方便以后复习。 题目描述: 找到提供的句子中最长的单词,并计算它的长度。 函数的返回值应该是一个数字。思路: 实现很简单,split()拆分字符串,然后循环判断最长的字符长度。 这里再提一下Math.max()方法,用来返回指定数中最大的那个数。function findLo
【C语言】一个数组中只有两个数字是出现一次,其他所有数字都出现了两次,找出这两个数字!
一个数组中只有两个数字是出现一次,其他所有数字都出现了两次,找出这两个数字!
给定一个file, 查找出里面出现频率最高的10个单词
之前已经总结了给定一组数字, 如何在线性时间内找到第k小的数字。 这两个问题看似有十分subtle的关系。 很显然这里是找最大的前K个单词。 单词相当于卫星数据, 直接对单词的键值, 即频率排序啦。  现在我们对这个求top K frequent words做一个小小的总结。 方法一: minheap + external sort(即小顶堆 + 外部排序) 之所以使用外部排序, 是因为考
字符串之输出所有字母组合相同的单词
有个题目,就是给你100W个字典顺序的单词,让输出所有字母组成相同的单词,比如post,stop,pots。   我的方法是:   hash映射 视为26进制数  每个计算hash值 然后找出其它种组合的哈希值 看是否存在 剪枝的策略 是如过进行到后边,不查询前边的 例如stop 那么不查询post或者pots 因为p 这样是O(N)? 一般的方法好像是《编程珠玑》上的w
众数的程序(使用到快速排序)
以下这个众数的程序,帮忙看下哪里出错了?
一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。找出这两个数字,编程实现。
一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。找出这两个数字,编程实现。 本题思路: 1.将0与数组每个元素依次亦或的结果就是两个只出现一次的元素亦或的值,相同元素的二进制位是相同的,亦或的值为0 2.将数组分为两组,每一组包含一个只出现一次的数,分组的思路是:两个唯一的数是不相同的,那么在他们的二进制序列中必然有一位是不相同的,找出这一位,以这一位为标志,将其余数进行分组。
例题:安迪的第一个字典(UVa 10815)
【问题描述】输入一个文本,找出所有不同的单词(连续的字母序列),按字典序从小到大输出。单词不区分大小写。 【样例输入】 Adventures in Disneyland Two blondes were going to Disneyland when they came to a fork in the road. The sign read: "Disneyland Left."
js基础算法之 找到字符串中最长的单词
同样出自freeCodeCamp上的测试题测试提示:找到提供的句子中最长的单词,并计算它的长度。函数的返回值应该是一个数字。当你完成不了挑战的时候,记得开大招’Read-Search-Ask’。这是一些对你有帮助的资源: String.split() String.length 方法1:数组的map(),reduce()方法function findLongest(str){
Shell gawk统计文件的各个单词数
通过gawk 命令对文件进行统计单词数 gawk 'BEGIN{ FS=" " } { arr=NF for (i=1; i<= arr; i++) { varr[$i]=varr[$i]+1 } } END{ for (test in varr) { print test, varr[test]
查找一段英文中各个单词出现的次数
package test.com; import java.util.HashMap; import java.util.Map; import java.util.Scanner; public class test2 { public static void main(String[] args) { System.out.println("请输入一段英文"); Scanner
C语言 在已知字符串中找最长单词
编程在一个已知的字符串中找最长单词,假定字符串中只含字母和空格,空格用来分隔不同单词。 比如:"ni hao world",最长单词是5个字母 这个题目其实不难,但是很多初学者会没有思路,我把这个分享出来.编译器用的是xCode. int length = 0, temp = 0;         char str[100] = ""; //xCode中没有
java基础—找出两个字符串中最大的子串
找出两个字符串中最大相同的子串 public class StringMaxString { //找一个字符串的最大子串 public static void main(String[] args) { // TODO Auto-generated method stub String s1=
统计大量文本中重复字符串的最大个数
有大量中文繁体的文本,都是网上摘取的,大小有6G。需要提取文本中相同的字符串的最大个数 有几个关键问题: 1.字符串的粒度如何确定?如何表示字符串的唯一位置索引? 2.字符串过多,如何快速确定是否相同,时间复杂度要尽量低 3.文本过多,无法放入内存怎么办 4.如何统计相同hash值的个数,以及记录它们的索引位置 对于1,每次读取一行,然后以100个字节为一组作为比较的字符串。每行最后一
【C语言助教】输入一行文本,其中包含多个单词,找出最长的单词长度
//**************************************************** //第7题 //输入一行文本,其中包含多个单词,找出最长的单词长度 //**************************************************** #include #include #include #include void main() { c
linux bash shell 统计一个文本中 单词 频率的 脚本详解
#!/bin/bash end=$1 cat $2| tr -cs "[a-z][A-Z]" "\n" | tr A-Z a-z | sort | uniq -c | sort -k1nr -k2 | head -n$end 这段bash脚本接收两个参数,分别是 $1和$2,$1表示频率最高的$1个单词,而$2则表示要分析的文件路径。 接下来就是一系列
Linux作业(三)-shell统计某文章中出现频率最高的N个单词并排序输出出现次数
#!/bin/bash if [ $# -ne 2 -a $# -ne 1 ] ;then echo "usage: `basename $0 ` [n] input file " echo exit fi if [ $# -eq 1 ];then I_TOP=10 I_FILE=$1 fi
立即提问