我想按以下顺序从文本文件中读取输入 将url读入String变量,将该url之后的所有单词读入ArrayList变量。下次我遇到一个url时,我想调用一个方法来对我到目前为止读到的内容执行操作,然后再将新url设置为原始String变量,依此类推。
到目前为止,我所做的是
public void read() throws IOException {
PerformCheck pc = new PerformCheck();
Scanner sc = new Scanner(new File("input.txt"));
sc.useDelimiter(",");
String url ="";
String res ="";
ArrayList tmp = new ArrayList();
while (sc.hasNext()) {
String s = sc.next().trim();
if (s.contains("http")){
url = s;
}
else {
tmp.add(s);
if (sc.next().contains("http")){ //getting error here
result= pc.perform(url,tmp);
url= "";
tmp= null;
}
}
}
sc.close();
}
代码中的注释 - 是我认为我收到错误的地方。基本上,我试图展望下一个令牌是否是一个网址,我该怎么做?
我的输入文件看起来像这样
url,word1,word2,word3 url2,word1,word2,word3
答案 0 :(得分:3)
您可以在第一次保存网址时保存,并在第二个网址中保存而不锁定: 看起来像这样:
public void read() throws IOException {
PerformCheck pc = new PerformCheck();
Scanner sc = new Scanner(new File("input.txt"));
sc.useDelimiter(",");
String url = "";
String res = "";
boolean lock = true;
ArrayList<String> tmp = new ArrayList<String>();
while (sc.hasNext()) {
String s = sc.next().trim();
boolean isHttp=s.contains("http");
if (isHttp && lock) {
url = s;
lock=false;
}
else if (isHttp){
result= pc.perform(url,tmp);
url= s;
tmp= new ArrayList<String>();
// Perform check here
// url=s
//tmp=new ArrayList<String>();
}else {
tmp.add(s);
}
}
if (tmp.size()>0){
result=pc.perform(url,tmp);
}
sc.close();
}
锁定只是您第一次找到网址。
答案 1 :(得分:1)
问题在于没有&#34;展望未来&#34;在扫描仪中。使用next()
后,它实际上会尝试读取下一个项目。如果它在那时到达文件的末尾,则不会成为下一个项目,并且您将收到错误。
这就是为什么必须始终检查hasNext()
,始终只执行一next()
每hasNext()
(无论是否&#39; s next()
,nextInt()
,nextDouble()
或其他任何内容。
处理此类要求的常用方法是保留您目前所阅读的内容,并查看您已阅读的当前项。如果它是一个URL,您知道您应该使用到目前为止收集的任何内容。在伪代码中:
put null in url
put null in list
open the scanner
while there is a next item in the scanner
set temp to the next item
if temp is a URL
if url has a value
process url and list
end if
put temp in url
create an empty list
else
add temp to list
end if
end while
process the url and list
部分说&#34;如果url有值&#34;意味着这不是我们正在阅读的第一个URL。也就是url != null
。
因此,当您遇到URL时,只有在存在以前的URL(处理以前的数据)时才会执行某些操作,并且您总是会执行某些操作(分配新URL,准备新列表。 #39; t准备一个新的列表,你也会收到错误!)。
如果您没有遇到过网址,则表示您已经有一个准备好的列表,并将该项目添加到该网址中。
这样,没有前瞻 - 只回头看。
但这意味着在循环之后你有一个URL和一个尚未处理的列表,这就是为什么你需要执行&#34;过程&#34;再次运作。
答案 2 :(得分:1)
bsondump