当前位置: 首页 > 知识库问答 >
问题:

使用数组查找包含在2个java文本文件中的唯一单词列表

易骁
2023-03-14

我需要读取两个文本文件并显示两个文本文件中的所有唯一单词。(两个文件中的单词只能打印一次)

文件1.txt

老虎

猎豹

大象

奶牛

file2.txt

老鼠

奶牛

预期产出:

狮子老虎猎豹大象奶牛狗猫老鼠

public class Workshop {

static int count1 = 0;
static int count2 = 0;

private static final String FILE1 = "C:\\Users\\shagi\\Desktop\\file1.txt";
private static final String FILE2 = "C:\\Users\\shagi\\Desktop\\file2.txt";

static String arrayLines1[] = new String[countLines(FILE1)];
static String arrayLines2[] = new String[countLines(FILE2)];
static String totalArray[] = new String[arrayLines1.length + arrayLines2.length];
static String arrayLines1new[]=new String[countLines(FILE1)];
static int flag = 0;
static int k=arrayLines1.length;

public static void main(String[] args) throws IOException {
    readFile(FILE1, FILE2);
    displaySimilar();
    displayAll();
}

public static int countLines(String File) {
    int lineCount = 0;
    try {
        BufferedReader br = new BufferedReader(new FileReader(File));
        while ((br.readLine()) != null) {
            lineCount++;
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return lineCount;
}

public static void readFile(String File1, String File2) {
    String contents1 = null;
    String contents2 = null;
    try {
        FileReader file1 = new FileReader(File1);
        FileReader file2 = new FileReader(File2);
        BufferedReader buf1 = new BufferedReader(file1);
        BufferedReader buf2 = new BufferedReader(file2);
        while ((contents1 = buf1.readLine()) != null) {
            arrayLines1[count1] = contents1;
            count1++;
        }
        while ((contents2 = buf2.readLine()) != null) {
            arrayLines2[count2] = contents2;
            count2++;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

有两种方法,我试图找到我的问题的答案方法1

public static void displayAll() {
    for (int i =0; i<k-1;i++){
        System.out.println(totalArray[i]);
    }

    System.out.println(totalArray[k-1]);
    System.out.println("");
    int p=0;
    for (int i=0;i<arrayLines2.length;i++){
        for (int j=0;j<arrayLines1.length;j++){
            if (arrayLines2[i].equals(arrayLines1[j])){
                flag=1;
                break;
            } else {
                flag=0;
            }
            if (flag==1){
                arrayLines1new[p]=arrayLines2[i];
                p++;
            }
        }
    }

方法2

 public static void displayAll() {
    for (int i=0;i<arrayLines1.length;i++){
        String a=arrayLines1[i];
        for (int j=0;j<arrayLines2.length;j++){
            String b =arrayLines2[j];
            if (!a.equals(b)){
                System.out.println(a);
            }
        }
    }
 }

但两者都没有给出预期的输出。

共有2个答案

封弘伟
2023-03-14

对于哈希映射来说,这将是一个很好的情况。键将是单词,值将是出现次数。然后,您可以打印出值为 1 的密钥。伪代码如下所示:

  1. 初始化映射:哈希映射

您还可以使用两个arrayList完成相同的任务,一个用来跟踪单词,另一个用来记录计数。

这两种方法的时间复杂度都是O(N ),但是使用map更有效,因为map的值可以在O(1)中更新。

华季同
2023-03-14

有很多冗余代码。这是一个更简单、更短的版本。

我正在使用Set及其操作来查找常见(交集)、不常见和所有唯一的单词。

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

public class Workshop {

    private static final String FILE1 = "C:\\Users\\shagi\\Desktop\\file1.txt";
    private static final String FILE2 = "C:\\Users\\shagi\\Desktop\\file2.txt";

    static Set<String> file1Words = new HashSet<String>();
    static Set<String> file2Words = new HashSet<String>();
    static Set<String> allWords = new HashSet<String>();
    static Set<String> commonWords = new HashSet<String>();
   static Set<String> uncommonWords = new HashSet<String>();

    public static void main(String[] args) throws IOException {
        file1Words.addAll(readFile(FILE1));
        file2Words.addAll(readFile(FILE2));
        System.out.println("file1  : " + file1Words);
        System.out.println("file2  : " + file2Words);
        displaySimilar();
        System.out.println("common : " + commonWords);
        displayAll();
        System.out.println("all    : " + allWords);
         displayUnCommon();
        System.out.println("uncommon : " + uncommonWords);
    }

    public static void displaySimilar() {
        commonWords.addAll(file1Words);
        commonWords.retainAll(file2Words);
    }

    public static void displayUnCommon() {
         uncommonWords.addAll(file1Words);
        uncommonWords.addAll(file2Words);
        uncommonWords.removeAll(commonWords);
    }

   public static Set<String> readFile(String file) {
        Set<String> words = new HashSet<String>();
        try {
            FileReader fileReader = new FileReader(file);
            BufferedReader buffer = new BufferedReader(fileReader);
            String content = null;
            while ((content = buffer.readLine()) != null) {
                words.add(content);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return words;
    }

    public static void displayAll() {
        allWords.addAll(file1Words);
        allWords.addAll(file2Words);
    }
}

示例运行:

file1  : [lion, cheetah, tiger, elephant, cow]
file2  : [lion, mouse, cat, cow, dog]
common : [lion, cow]
all    : [cheetah, lion, cat, mouse, tiger, elephant, cow, dog]
uncommon : [cheetah, cat, mouse, tiger, elephant, dog]
 类似资料:
  • 问题内容: 我试图加快我的项目以计算单词频率的速度。我有360多个文本文件,我需要获取单词的总数以及另一个单词列表中每个单词出现的次数。我知道如何使用单个文本文件执行此操作。 要获得“通货膨胀”,“工作”,“产出”个体的频率过于繁琐。我可以将这些单词放入列表中并同时查找列表中所有单词的出现频率吗?基本上,这与Python。 示例:代替此: 我想这样做(我知道这不是真实的代码,这是我在寻求帮助的内容

  • 如果案文是: 我想要一个句子(句子边界是句号,后面是空格),其中有“他”和“米兰”,即第三个句子(顺序不重要。任何同时有这两个词的句子都是必需的) 我尝试了上面的regex pattrn和其他许多方法 但是它在'milan'之后提取部分句子,或者从第一个'he'开始提取两个句子 请建议使用regex或Java中的任何其他方法完成此任务的方法 (我正致力于提取2个实体之间的关系模式:在这种情况下,关

  • 问题内容: 如何使用Java在多个文本文件中查找和替换单词? 这是我一次做的方法… 问题答案: 从Commons IO使用:

  • 我是新来的,我想要得到一个文本文件的单词列表和单词数。这是我尝试过的代码: 输出:century Cepheus CEQ陶瓷Cerberus谷类小脑错误文件字数:0

  • 我有一个包含50000个单词的单词列表,还有一个逐行查找字母字符的txt文件。我试图通过按顺序阅读单词列表中的单词来找到包含7个不同字母的单词,我为此编写了一个方法。 首先,我浏览单词并同步字符列表,然后通过导航字母txt文件在单词中相互检查,如果有,则增加计数器。通过这种方式,我试图了解单词中有多少不同的字母,最后,如果它提供了控制,我会将其添加到列表中。 读取txt文件并返回哈希集。 但它不是

  • 给定两个文件会产生一个算法/程序来查找文件1中的单词,而不是文件2中的单词。请注意,文件中的单词不是按顺序排列的。 这是我的思考过程: 步骤1:读取文件2的单词并将其添加到哈希集 如果两个文件中的字数都只有100或1000个,那么这个算法就可以正常工作 但是,如果两个文件都很大(数十亿字),那么此解决方案将无法工作,因此我提出了一个改进的解决方案: 步骤1:逐字阅读文件2,并按字母顺序对单词进行排