以预定义的顺序读取输入

时间:2015-08-22 08:26:50

标签: java input java.util.scanner

我想按以下顺序从文本文件中读取输入 将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

3 个答案:

答案 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