如何使用Scanner类中的hasNext()?

时间:2015-12-18 11:51:29

标签: java java.util.scanner

输入格式

stdin(System.in)读取一些未知的n行输入,直到达到EOF;每行输入都包含一个非空字符串。

输出格式

对于每一行,打印行号,后跟一个空格,然后接收作为输入的行内容:

示例输出

Hello world
I am a file
Read me until end-of-file.  

这是我的解决方案。问题是我无法继续进行EOF。 但输出只是:

Hello world

这是我的代码:

public class Solution {

    public static void main(String[] args) {
        check(1);  // call check method
    }

    static void check(int count) {          
        Scanner s = new Scanner(System.in);
        if(s.hasNext() == true) {
            String ns = s.nextLine();
            System.out.println(count + " " + ns);
            count++;
            check(count);
        }
    } 
}

12 个答案:

答案 0 :(得分:6)

您的代码无效,因为您在每次递归调用中都创建了一个新的Scanner对象。 不管怎么说,你不应该使用递归,而是迭代地进行。

迭代版

public class Solution {

    public static void main(String[] args) {

        Scanner s = new Scanner(System.in);
        int count = 1;

        while(s.hasNext()) {
            String ns = s.nextLine();
            System.out.println(count + " " + ns);
            count++;
        }
    }
}

递归版

public class Solution {

    private Scanner s;

    public static void main(String[] args) {

        s = new Scanner(System.in); // initialize only once
        check(1);
    }

    public static void check(int count) {
        if(s.hasNext()) {
            String ns = s.nextLine();
            System.out.println(count + " " + ns);
            check(count + 1);
        }
    }   
}

答案 1 :(得分:2)

更改

     @Override
     protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
                Window window = getWindow();
                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                window.setStatusBarColor(getResources().getColor(
                                R.color.your_color));
            }
           setContentView(R.layout.your_layout);

                   //Your implementation
     }

为:

if (s.hasNext() == true) {
    String ns = s.nextLine();
    System.out.println(count + " " + ns);
    count++;
    System.out.print(count);
    check(count);
}

while (s.hasNext()) { String ns = s.nextLine(); System.out.println(count + " " + ns); count++; System.out.print(count); check(count); } 循环一直持续到数据存在,而while仅检查一次。

答案 2 :(得分:1)

如果要求使用递归,则可以使用辅助函数:

static void check(int count) {          
    Scanner s = new Scanner(System.in);
    check(count, s);
} 

static void check(int count, Scanner scanner) {
    if(!scanner.hasNext()) {
        return;
    }
    String ns = scanner.nextLine();
    System.out.println(count + " " + ns);
    check(++count, scanner);
}

注意new Scanner(System.in)仅被调用一次。

答案 3 :(得分:1)

Scanner有点BufferedReader(我不是在讲述继承或其他什么。我告诉他们两个都有缓冲区。Scanner只有一个小缓冲区。)因此,在控制台中输入文本后,这些文件将read() System.in并存储在Scanner内的缓冲区中。

public static void main(String[] args) {          
    Scanner s1 = new Scanner(System.in);
    s1.hasNext();
    Scanner s2 = new Scanner(System.in);
    while(true){
        System.out.println("Read line:: " + s2.nextLine());
    }
}

将以下输入用于Scanner

  

第1行   第2行   第3行   第4行

您将获得输出:

  

读取行:: e 1
  读行::第2行
  读行::第3行
  读取行::第4行

我想你可能知道这个输出的原因。第一行的某些字符位于Scanner s1中。因此,创建2 Scanner来从同一Stream获取输入。

您可以按如下方式更改代码以获得所需的输出。

private static Scanner s;

public static void main(String[] args) {
    s = new Scanner(System.in);
    check(1);  // call check method
}

static void check(int count) {
    if (s.hasNextLine()) {
        String ns = s.nextLine();
        System.out.println(count + " " + ns);
        count++;
        check(count);
    }
}

在逐行阅读时,您可以使用s.hasNextLine()代替s.hasNext()

当且且仅当s.hasNextLine()==truetrue时,无需使用s.hasNextLine(),因为该语句将为true

您可以使用Windows系统中的EOF和Unix中的Ctrl+ZCtrl+D字符提供给控制台。据我所知,您无法使用NetBeans的输出窗口发送EOF字符。

答案 4 :(得分:0)

public static void main(String[] args) {

    List<String> eol = new ArrayList<String>();
    Scanner in=new Scanner(System.in);
    int t=1;
    while(in.hasNext()){

        eol.add(in.nextLine());
    }

    for (String i:eol){

        System.out.println(t+" "+i);
        t++;
    }

}

答案 5 :(得分:0)

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    int count = 1;
    while(scan.hasNext()){
        System.out.println(count++ + " " + scan.nextLine());            
    }
}

答案 6 :(得分:0)

这是无错误程序。

import java.util.Scanner;

public class Solution {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int count = 1;
        while(scan.hasNext()) {
            String s = scan.nextLine();
            System.out.println(count + " " + s);
            count++;
        }
    }
}

答案 7 :(得分:0)

Scanner scanner = new Scanner(System.in);
int i = 1;
while(scanner.hasNext()) {
  System.out.println(i + " " + scanner.nextLine());
  i++;
}

答案 8 :(得分:0)

使用while而不是if,但递归版本更好。这是迭代版本:

import java.io.*;
import java.util.*;

public class Solution {

    public static void main(String[] args) {
        /* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */
        Scanner sc=new Scanner(System.in);
        {
            int i=0;

          while(sc.hasNext()==true)
            {
                i=i+1;
                 String s=sc.nextLine();
                System.out.println(i+" "+s);

            };
        }
    }
}

答案 9 :(得分:0)

java.util.Scanner.hasNext()基本上可以帮助您阅读输入。如果此扫描程序的输入中包含其他任何类型的令牌,则此方法返回true。否则返回false。  检查以下代码段,

 while(sc.hasNext()) {
      System.out.println(i + " " + sc.nextLine());
      i++;
 }

您可以在下面的链接中找到完整的代码,

https://github.com/hetalrachh/HackerRank/blob/master/Practice/Java/Introduction/EndOfFile.java

答案 10 :(得分:0)

您可以尝试这样获得所需的结果:

公开类EOF {

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    for(int i =1;scan.hasNext();i++) {
        String line = scan.nextLine();
        System.out.println(i + " " + line);
    }
    scan.close();
}

}

答案 11 :(得分:0)

public class Solution {

    
    public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    for(int i=1; scan.hasNext() ; 
    System.out.println(i++ +" "+scan.nextLine()));
        
      
    }
}