我正在使用2个不同的Scanner对象从2个单独的文件中读取输入。我有2个嵌套循环,其连续条件取决于Scanner的.hasNext()方法返回的内容。
我正在比较每个文件的内容。如果有匹配,我想打印出来。但是,我当前的代码一直返回null,我不知道为什么。你能告诉我我做错了什么吗?
Scanner stdin1 = new Scanner("file1.txt");
Scanner stdin2 = new Scanner("file2.txt");
while(stdin1.hasNext()){
while(stdin2.hasNext()){
if(stdin1.next().equals(stdin2.next()){
//This line below is giving the error
System.out.println(stdin1.next() + " " + stdin2.next() );
}
}
}
答案 0 :(得分:1)
您的hasNext()
方法会检查是否还有其他元素。如果它返回true,则表示还有一个元素可以使用next()
方法访问。
在您的代码中,对于每个hasNext()
,您要拨打next()
两次,这不是正确的方法。
您应该将代码修改为有点像这样:
Scanner stdin1 = new Scanner("file1.txt");
Scanner stdin2 = new Scanner("file2.txt");
while(stdin1.hasNext()){
while(stdin2.hasNext()){
Object one = stdin1.next();
Object two = stdin2.next();
if(one.equals(two)){
//This line below is giving the error
System.out.println(one + " " + two );
}
}
}
修改强>
请注意,next()
如果没有下一个令牌,则不会返回null。此技术用于处理枚举的nextElement方法抛出的错误java.util.NoSuchElementException
,以指示枚举中没有更多元素。 [source]
答案 1 :(得分:1)
我意识到你要实现的目标并不是你在代码中所做的事情。
构造函数Scanner(String source)
不会将文件名作为输入。
请改用此构造函数:Scanner(File file)
要实现您的目标,请尝试以下方法:
更新:需要关闭扫描仪对象并在内部while循环内重新打开,这是由于多个i / o操作导致的不必要的开销。要避免这种情况,请将元素捕获到列表中,然后进行比较。试试这段代码:
Scanner stdin1 = new Scanner(new File("file1.txt"));
Scanner stdin2 = new Scanner(new File("file2.txt"));
List list1 = new ArrayList();
List list2 = new ArrayList();
while (stdin1.hasNext()) {
list1.add(stdin1.next());
}
while (stdin2.hasNext()) {
list2.add(stdin2.next());
}
for (Object o1 : list1) {
for (Object o2 : list2) {
if (o1.equals(o2)) {
System.out.println(o1 + " " + o2);
}
}
}
希望这有帮助!
答案 2 :(得分:1)
“返回null”表示程序不打印任何内容。
两个问题。
首先,Scanner(String text)
在给定字符串上创建扫描程序。 它不会创建扫描程序来读取给定名称的文件。相反,您应该给它一个File
。
Scanner stdin1 = new Scanner(new File("file1.txt"));
其次,嵌套的while循环是什么?在从中提取令牌之前,您应该检查两个扫描程序。
while (stdin1.hasNext() && stdin2.hasNext()) {
String one = stdin1.next();
String two = stdin2.next();
if (one.equals(two)) {
// print
}
}
// Now maybe one of them still got tokens, but we are printing
// the tokens that are equal, so doesn't matter.
为什么你的代码什么都不打印?由于stdin1.next()
返回"file1.txt"
而stdin2.next()
返回"file2.txt"
。
答案 3 :(得分:1)
两个 while循环是高时间复杂度,尝试用一个循环解决这个问题,并在执行后关闭程序。
public static void main(String[] args) {
Scanner stdin1 = null, stdin2 = null;
try {
stdin1 = new Scanner(new File("C:\\Users\\pechen\\Documents\\file1.txt"));
stdin2 = new Scanner(new File("C:\\Users\\pechen\\Documents\\file2.txt"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
while (stdin1.hasNext()) {
if (stdin2.hasNext()) {
Object o = stdin1.next();
if (o.equals(stdin2.next())) {
System.out.println(o);
}
} else {
break;
}
}
}