使用带有System.in的扫描程序时,Java程序无法终止

时间:2014-05-25 07:10:46

标签: java java.util.scanner eof

我无法终止我的java程序,它接受一些字符串作为输入,下面是我用来处理输入的代码

import java.util.Scanner;

public class EPALIN {

public static void main(String[]args)
{
    Scanner sc = new Scanner(System.in);

    String p = null;
    while((p=sc.nextLine())!=null)
    {
        System.out.println(getPalin(p));
    }
    sc.close(); 
}

public static String getPalin(String st)
{
    int i =0;
    int j = st.length()-1;

    String res = "";

    while(i<=j)
    {
        if(st.substring(i, i+1).equals(st.substring(j, j+1)))
        {
            res+=st.substring(i, i+1);
            i++;
            j--;
        }
        else
        {
            res+=st.substring(i,i+1);
            i++;
        }
    }
    if(res.length()%2==0)
    return res+(new StringBuffer(res).reverse().toString());
    else
        return res+(new StringBuffer(res).reverse().toString().substring(1));   
}
}

即使使用

while((p=sc.nextLine())!="")

没有工作,这是来自SPOJ problemId EPALIN的问题

3 个答案:

答案 0 :(得分:2)

做这样的事情

while(!(p=sc.nextLine()).equals("")) {
// ...
}

我尝试使用我正在使用的代码并且它似乎有效。

public static void main(String[]args)
{
    Scanner sc = new Scanner(System.in);

    String p = null;
    while(!(p=sc.nextLine()).equals(""))
    {
        System.out.println(getPalin(p));
    }
    sc.close(); 
}

public static String getPalin(String st)
{
    int i=0;
    int j=st.length()-1;

    String res = "";

    while(i<=j)
    {
        if(st.substring(i, i+1).equals(st.substring(j, j+1)))
        {
            res+=st.substring(i, i+1);
            i++;
            j--;
        }
        else
        {
            res+=st.substring(i,i+1);
            i++;
        }
    }
    if(res.length()%2==0)
        return res+(new StringBuffer(res).reverse().toString());
    else
        return res+(new StringBuffer(res).reverse().toString().substring(1));   
}

}

答案 1 :(得分:1)

你应该使用hasNext()

String delimiter = "\r\n|\r"; //Or try System.getProperty("line.separator");
Scanner scanner = new Scanner(System.in);
scanner.useDelimiter(delimiter);  

    while (scanner.hasNext()) {
        String p = scanner.next();
        // ...
    }
}

答案 2 :(得分:0)

请参阅扫描仪documentationScanner.nextLine()不会返回null。如果输入结束(例如,判断已将文件传送到stdin,并且文件结束),则它将抛出NoSuchElementException。如果没有,nextLine()将阻止。

通常你可以在这里做什么,因为problem description表示每个测试用例都在它自己的行上(类似于CandiedOrange所建议的):

while (scanner.hasNextLine()) {
    String line = scanner.nextLine();
    ...
}

然而,问题还说明:

  

大I / O.在某些语言中要小心。

在比赛问题术语中,这意味着“不要使用扫描仪”。对于快速I / O,您有几个选项,但是如下所示应该可以正常工作,同时保持您的时间限制:

public static void main(String[] args) throws IOException {    
    BufferedReader in = new BufferedReader(new InputStreamReader(
            System.in));

    String line;
    while ((line = in.readLine()) != null)
        doSomething(line); // etc
}

请注意,您很可能还必须收集所有输出并在最后打印,而不是制作一堆System.out.println(),这些开销只能打印一次就可以避免。