「已注销」 2016-07-29 00:02 采纳率: 50%
浏览 2467

写一个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条回答

  • 「已注销」 2016-07-29 00:51
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 将二维数组,按照假设的规定,如0/1/0 == "4",把对应列位置写成一个字符并打印输出该字符
  • ¥15 NX MCD仿真与博途通讯不了啥情况
  • ¥15 win11家庭中文版安装docker遇到Hyper-V启用失败解决办法整理
  • ¥15 gradio的web端页面格式不对的问题
  • ¥15 求大家看看Nonce如何配置
  • ¥15 Matlab怎么求解含参的二重积分?
  • ¥15 苹果手机突然连不上wifi了?
  • ¥15 cgictest.cgi文件无法访问
  • ¥20 删除和修改功能无法调用
  • ¥15 kafka topic 所有分副本数修改