我有两个文本文件。一个包含所有英语单词,另一个包含来自网站的用户名列表。
我想过滤掉与英语词典中的单词相同的用户名(例如“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);
}
}
}
}
答案 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
。