匹配两个文本文件之间的单词

时间:2014-08-13 17:31:51

标签: java text match

我有两个文本文件。一个包含所有英语单词,另一个包含来自网站的用户名列表。

我想过滤掉与英语词典中的单词相同的用户名(例如“Envelope”)

这是我当前的代码,但它什么也没有返回。我哪里错了?

import java.io.*;
import java.util.*;

class dict{
    public static void main(String args[]) throws Exception{

        Scanner kb = new Scanner(System.in);
        String name;
        String curr;

        java.io.File dictionary = new java.io.File("EnglishDict.txt");
        Scanner dictScanner = new Scanner(dictionary); 

        java.io.File list = new java.io.File("usernames.txt");
        Scanner listScanner = new Scanner(list);  

        while(dictScanner.hasNextLine()){
            curr=dictScanner.next();
            while(listScanner.hasNextLine()){
                name=listScanner.next();

                if(curr.equals(name)) System.out.println(name);
            }
        }
    }
}

4 个答案:

答案 0 :(得分:1)

一旦用户名的扫描程序到达该文件的末尾,就不会再读取用户名。理论上(!!)您必须重新启动("倒回")此顺序文本文件,用于将所有用户名与字典中的第二个,第三个等字进行比较。

这将花费太长时间(除非用户名的数量相当小)。

将用户名(可能是较小的文件)读入Set<String>并根据此集检查字典:

Set<String> usernames = new HashSet<>();
while (listScanner.hasNextLine()) {
     usernames.add( listScanner.nextLine() );
}

while (dictScanner.hasNextLine()) {
     String curr = dictScanner.nextLine();
     if( usernames.contains( curr ){
         System.out.println( curr );
     }
}

答案 1 :(得分:0)

您必须在嵌套循环中重复1次后重置listScanner。而且您必须使用nextLine()代替next()

class dict {

    public static void main(String args[]) throws Exception {

        Scanner kb = new Scanner(System.in);
        String name;
        String curr;

        java.io.File dictionary = new java.io.File("EnglishDict.txt");
        Scanner dictScanner = new Scanner(dictionary);

        java.io.File list = new java.io.File("usernames.txt");
        Scanner listScanner = new Scanner(list);

        while (dictScanner.hasNextLine()) {
            listScanner = new Scanner(list);
            curr = dictScanner.nextLine();
            while (listScanner.hasNextLine()) {
                name = listScanner.nextLine();

                if (curr.equals(name)) {
                    System.out.println(name);
                }
            }                
            listScanner.close();
        }
    }
}

答案 2 :(得分:0)

这两个循环导致了这个问题。在外循环的第一次迭代期间,扫描程序读取usernames.txt的全部内容。在第二次迭代期间,扫描程序已经结束,因此hasNextLine()为false。

尝试类似:

while(dictScanner.hasNextLine()){
    curr=dictScanner.nextLine();
    listScanner = new Scanner(list);

    while(listScanner.hasNextLine()){
        name=listScanner.nextLine();
        if(curr.equals(name)) System.out.println(name);
    }
}

将在外循环的每次迭代中重新初始化第二个扫描程序。

编辑:使用nextLine和@ afzalex的回答一样

答案 3 :(得分:0)

对于外循环的每次迭代,您需要重新启动对用户名文件的扫描。

目前,您的内部循环会立即扫描到您的用户名文件的末尾,并且永远不会在外部循环的后续迭代中再次从顶部开始。

您可以通过添加:

来实现此目的
listScanner = new Scanner(list);

作为外循环中的最后一个语句。

注意,反复扫描这样的文件是非常低效的。如果您的某个文件很小(小于千兆字节),请考虑先将其完全加载到HashSet